2011-05-06 17 views
5

Estoy aprendiendo SQLite3 por medio de un libro ("Uso de SQLite") y la base de datos Northwind. He escrito el siguiente código para ordenar a los clientes por el número de clientes en su ciudad, luego alfabéticamente por su nombre.Cómo optimizar una consulta SQLite3

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

Tarda unos 50-100ms en ejecutarse. ¿Existe un procedimiento estándar a seguir para optimizar esta consulta o, en términos más generales, consultas de este tipo?

Respuesta

1

en general (no sólo SQLite), es mejor que hacer el recuento de todos los valores (ciudades) a la vez, y se unen para construir la consulta:

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 

(para evitar, como en su caso , la cuenta se calcula muchas veces para el mismo valor (ciudad))

7

En el caso más general, la optimización de la consulta comienza con reading the query optimizer's execution plan. En SQLite, sólo tiene que utilizar

EXPLAIN QUERY PLAN statement 

en su caso,

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

También podría ser necesario para leer la salida de

EXPLAIN statement 

que entra en more low-level detail.

Cuestiones relacionadas