SQLite, как можно более эффективно выбирать на больших таблицах? - PullRequest
0 голосов
/ 26 мая 2020

кто-нибудь из вас знает, как сделать этот выбор быстрее или эффективнее? Дело в том, что на обработку этого выбора на SQLite уходит больше часов. Я использую его с sqlite3 на Python, поэтому есть несколько ограничений команд.

 SELECT C.id, COUNT (L.linea_construccion) 
 FROM Linea L, Predio P, Comunas C 
 WHERE L.calidad_construccion = 1 AND C.id = P.comuna
      AND L.comuna = C.id AND P.avaluo_exento > C.avaluo_promedio 
 GROUP BY C.id 

В базе данных 3 таблицы, таблица Linea имеет 9MM строк, таблица Predio имеет 7MM, а таблица Comunas - примерно 250.

Формат таблиц:

Predio. (id INT, comuna INT, avaluo_exento INT)

Linea. (id INT, comuna INT, calidad_construccion INT, linea_construccion INT)

Comuna. (id INT, avaluo_promedio INT)

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Сначала перепишите запрос, используя правильный, явный, стандартный , читаемый JOIN синтаксис:

 SELECT C.id, COUNT(*) 
 FROM Linea L JOIN
      Comunas C
      ON L.comuna = C.id JOIN
      Predio P 
      ON C.id = P.comuna AND P.avaluo_exento > C.avaluo_promedio 
 WHERE L.calidad_construccion = 1 
 GROUP BY C.id ;

Начните со следующих индексов:

  • Linea(calidad_construccion, comuna)
  • Comunas(id, avaluo_promedio) - вероятно, не обязательно, если «id» является первичным ключом
  • Predio(comuna, avaluo_exento)

В зависимости от того, сколько «коммунальных» "у вас есть и сколько из них возвращается, вы можете дополнительно оптимизировать этот запрос, удалив внешний GROUP BY.

0 голосов
/ 26 мая 2020

Вы всегда должны использовать explicit join для лучшей практики, вместо использования implicit join в условии where.

из данной схемы ваших таблиц, вы можете попробовать следующее

SELECT 
  C.id, 
  COUNT (L.linea_construccion) 
 FROM Linea L
 join Predio P
 on L.comuna = P.comuna

 join Comunas C 
 on L.comuna = C.comuna

 where L.calidad_construccion = 1
 AND P.avaluo_exento > C.avaluo_promedio 
 GROUP BY 
  C.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...