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 ответов

12 просмотров

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

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

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

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млрд влезет в память

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта