184 похожих чатов

Здравствуйте, товарищи! вот есть у меня: tableA - таблица, примерно 300млн записей tableB

- словарь, примерно 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

помогите, пожалуйста, в какую сторону думать/смотреть/читать/переделать запрос/уйти в монастырь?

17 ответов

15 просмотров

Правильное ощущение

Виктор-Большаков Автор вопроса
Константин
Правильное ощущение

а есть вариант сначала выбрать, а потом сджойнить?

table C нельзя разрезать на отдельные? индексация полей в таблицах B и C включена?

Виктор-Большаков Автор вопроса
Andrew
table 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 из джойн и вынести в словарь (хотя может оказаться и великовата но попробовать стоит)

Виктор-Большаков Автор вопроса
Владислав Lazycat
Для начала можно убрать таблицу B из джойн и вынес...

словарь там получался 50+ гигов, поэтому от него отказались

Виктор-Большаков Автор вопроса
Владислав Lazycat
На 2-3 поля???

да, просто данных много

Виктор Большаков
да, просто данных много

Далее интересно посмотреть ордер бай и индексы

Виктор-Большаков Автор вопроса
Владислав Lazycat
Далее интересно посмотреть ордер бай и индексы

ордер бай везде по полям, которые в ON у джойнов, дополнительных индексов нет

Виктор Большаков
не помогло

правые таблицы кладутся в ОЗУ, без шансов что C 5.5млрд влезет в память

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта