- словарь, примерно 5,5млн записей
tableC - таблица (заполняется из матвью), около 4,3 млрд записей
и есть запрос примерно такой:
SELECT a.field1, a.field2, a.field3,
b.field6, c.field5
FROM tableA AS a
LEFT OUTER JOIN tableB AS b
ON b.some_id1 = a.some_id1
LEFT OUTER JOIN tableC AS c
ON c.some_id1 = a.some_id1
AND c.some_id2 = a.some_id2
WHERE a.field6=123
AND a.field7 IN ('value1', 'value2')
вот этот запрос падает с таймаутом, очень долгий. похоже я чего-то не знаю про джойны, ощущение, что КХ сначала джойнит, а потом применяет where
помогите, пожалуйста, в какую сторону думать/смотреть/читать/переделать запрос/уйти в монастырь?
Правильное ощущение
а есть вариант сначала выбрать, а потом сджойнить?
Увеличить таймаут на запрос ?
5 минут на запрос...
table C нельзя разрезать на отдельные? индексация полей в таблицах B и C включена?
нет, там ключи, по которым джойн и поле, которое выбирается и всё, больше нет ничего, а по ключам непонятно как разрезать - это просто числа... ну и спрогнозировать как они попадут в выборку тоже не получится
Постарайтесь сначала отфильтровать каждую таблицу по известным вам данным, а потом джойните уже отфильтрованные данные из подзапросов. Базовый фильтрующий запрос можно вынести в WITH: WITH some_res as (SELECT …) SELECT … FROM some_res JOIN ( SELECT … FROM t2 WHERE param IN (SELECT param FROM some_res)
попробуйте поменять местами LEFT OUTER JOIN tableB AS b ON b.some_id1 = a.some_id1 LEFT OUTER JOIN tableC AS c ON c.some_id1 = a.some_id1 AND c.some_id2 = a.some_id2 на LEFT OUTER JOIN tableC AS c ON c.some_id1 = a.some_id1 AND c.some_id2 = a.some_id2 LEFT OUTER JOIN tableB AS b ON b.some_id1 = a.some_id1
о, вот это помогло, спасибо (:
Для начала можно убрать таблицу B из джойн и вынести в словарь (хотя может оказаться и великовата но попробовать стоит)
словарь там получался 50+ гигов, поэтому от него отказались
да, просто данных много
Далее интересно посмотреть ордер бай и индексы
ордер бай везде по полям, которые в ON у джойнов, дополнительных индексов нет
правые таблицы кладутся в ОЗУ, без шансов что C 5.5млрд влезет в память
Обсуждают сегодня