Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как оптимизировать SQL запрос, чтобы SUМ не считалась до конца?

В база простая, каскадная организация данных: table3 --> table2 --> table1. Т.е. table3 связана форенкеем с table2, которая в свою очередь связана форенкеем с table1. В table3 есть булево поле bExported, которое сигнализирует была-ли данная запись экспортирована в другую БД.

И вот я хочу получить такие записи из table1, чтобы у них "в связке" была хоть одна ещё не экспортированная запись: table3.bExported = FALSE.

Мне показалось разумным просуммировать все "связанные" bExported, и если эта сумма меньше общего числа записей той-же выборки, то получу искомое:
SELECT
  table1.*
FROM table3
  INNER JOIN table2
    ON table3.tab2_id = table2.id
  INNER JOIN table1
    ON table2.tab1_id = table1.id
GROUP BY
         table1.id,
         table1.datas
HAVING SUM(table3.bExported) < COUNT(table3.id)

Но записей в table3 -- полмиллиарда и перебрать их все, сделать SUM и COUNT --не быстро... На самом деле даже HAVING SUM(table3.bExported) > 0 -- выполняется на тоже время, хотя казалось бы догадаться, что как только SUM(table3.bExported) станет равным единице уже можно дальше не сканировать таблицы, ведь table3.bExported -- логическая и в ней не может быть отрицательных чисел...

И вот не понимаю, как это оптимизировать. В действительности же не нужно ничего "складывать" и "пересчитывать"... Нужно просто найти хоть одну table3.bExported = FALSE и этого достаточно. Причём table3.bExported -- имеет индекс и найти это быстро...

Но как написать такой запрос?...

P.S. Совсем идеально если такой запрос упасться записать на Django-ORM... Но, по-моему, это уже из области фантастики...
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
idShura
@idShura
Уберите
HAVING SUM(table3.bExported) < COUNT(table3.id)

И добавьте
WHERE table3.bExported = FALSE
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы