Как оптимизировать запрос SQLite3 - PullRequest
6 голосов
/ 06 мая 2011

Я изучаю SQLite3 с помощью книги («Использование SQLite») и базы данных Northwind. Я написал следующий код для заказа клиентов по количеству клиентов в их городе, а затем в алфавитном порядке по их имени.

SELECT ContactName, Phone, City as originalCity 
FROM Customers
ORDER BY (
      SELECT count(*) 
      FROM Customers 
      WHERE city=originalCity) 
   DESC, ContactName ASC

Для запуска требуется около 50-100 мс. Существует ли стандартная процедура для оптимизации этого запроса или, в более общем смысле, запросы его типа?

Ответы [ 2 ]

9 голосов
/ 08 мая 2011

В самом общем случае оптимизация запросов начинается с чтения плана выполнения оптимизатора запросов . В SQLite вы просто используете

EXPLAIN QUERY PLAN statement

В вашем случае

EXPLAIN QUERY PLAN
SELECT ContactName, Phone, City as originalCity 
FROM Customers
ORDER BY (
      SELECT count(*) 
      FROM Customers 
      WHERE city=originalCity) 
   DESC, ContactName ASC

Вам также может понадобиться прочитать вывод

EXPLAIN statement

, который входит в более низкоуровневую детализацию .

1 голос
/ 06 мая 2011

В общем (не только SQLite), лучше сделать подсчет для всех значений (городов) одновременно и объединение для построения запроса:

    SELECT ContactName, Phone, Customers.City as originalCity
      FROM Customers
      JOIN (SELECT city, count(*) cnt
              FROM Customers
          GROUP BY city) Customers_City_Count
        ON Customers.city = Customers_City_Count.city
  ORDER BY Customers_City_Count.cnt DESC, ContactName ASC

(чтобы, как и в вашем случае, не рассчитывать число раз для одного и того же значения (города))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...