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

Добрый день! кто знает может.. программисты пишут запросы где делается

join по большим таблицам, после этого идет where.. если переписать запрос (возможно с подзапросом), максимально сократить выборку, и делать join уже по этой малой выборке - запросы ускоряются в разы.. как правильно называется такое явление? как бороться системно?

39 ответов

30 просмотров

https://t.me/pgsql/303899

Вы бы пример показали (потому что, на первый взгляд, такое явление называется "мифотворчество", серьёзно).

Алексей-Алексеевич Автор вопроса
Yaroslav Schekin
Вы бы пример показали (потому что, на первый взгля...

SELECT o.1, s.2 FROM order o LEFT JOIN status s ON s.id=o.sid LEFT JOIN ... LEFT JOIN ... WHERE o.field = 1 AND ... SELECT o.1 s.2 FROM ( SELECT * from order WHERE field = 1 ) o LEFT JOIN status s ON s.id=o.sid WHERE ... если таблица order большая - сначала идет долгое объединение всех таблиц (через диск, медленно), потом по всему объему делается WHERE есть вариант WHERE order_id IN (select id from ... одна из join table) сталкиваюсь с таким регулярно, как на postgres, так и на mysql

Алексей Алексеевич
SELECT o.1, s.2 FROM order o LEFT JOIN status s...

> сталкиваюсь с таким регулярно, В PostgreSQL — нет, не сталкиваетесь (в норме). Для того, чтобы что-то такое происходило, нужны особые условия, которые в принципе приводят к тому, что такое "переписывание" является некорректным ([потенциальные] результаты запросов меняются, то есть). > так и на mysql MySQL — это совсем другой вопрос, не в этот чат. Что касается этого чата — покажите что-то конкретное уже. ;)

Алексей-Алексеевич Автор вопроса

я же показал идею, таблица order - 80+ гб, если прогеры пишут все в кучу - select ... join a, b,c where - эти все таблицы сначала объединяются, потом идет where, если перенести where в подзапрос, и по маленькой выборке делать join других таблиц - результаты в разы лучше.. с минут до миллисекунд я сокращал волшебные запросы программистов

Алексей Алексеевич
я же показал идею, таблица order - 80+ гб, если пр...

Я пытался [вежливо] донести до Вас, что сама эта идея — феерическая чушь, всего лишь (что касается PostgreSQL). > с минут до миллисекунд я сокращал волшебные запросы программистов См. выше про то, почему так могло быть. Если не хотите показывать ничего конкретного, то правильное название этой "идеи" (почти во всех случаях) я Вам уже написал.

Алексей-Алексеевич Автор вопроса
Yaroslav Schekin
Я пытался [вежливо] донести до Вас, что сама эта и...

конкретные запросы с прод системы показать не могу к сожалению, думал идея будет понятна

Алексей Алексеевич
конкретные запросы с прод системы показать не могу...

Идея понятна, только к реальности отношение она имеет в исключительных случаях.

Алексей-Алексеевич Автор вопроса
Yaroslav Schekin
Идея понятна, только к реальности отношение она им...

к сожалению нет, я уже 4+ таких ситуации разрешил, 3 на pg.. программисты делают "чтобы работало", плохо просчитывают рост.. со временем таблицы растут

Алексей Алексеевич
к сожалению нет, я уже 4+ таких ситуации разрешил,...

К сожалению да, и Вы почти наверняка сделали неправильные выводы из этих ситуаций (а то и "сломали" запросы). :(

Алексей-Алексеевич Автор вопроса

это прод система, и ситуации заключались в том, что сервер вставал колом, из-за объединения огромных таблиц (одна из них - 80+гб) на диске.. всё успешно разрешилось.. сталкивался с таким же на mysql, поэтому и обратился тут к знатокам, думаю это общая болезнь архитектурная/запросов

Алексей Алексеевич
это прод система, и ситуации заключались в том, чт...

Да сколько можно-то, в конце концов! Что касается именно PostgreSQL: Это. Феерическая. Чушь. Вам это ещё несколько раз повторить?! Если хотите разобраться, почему в тех случаях что-то менялось (а вариантов хватает, я уже упоминал некоторые выше) — нужна хоть какая-то конкретика. Если Вы хотите запомнить какой-то бред вроде "это общая болезнь архитектурная" — боюсь, Вам тут с этим не помогут. ;)

Алексей-Алексеевич Автор вопроса
Yaroslav Schekin
Да сколько можно-то, в конце концов! Что касается ...

ваши великолепные эмоции точно не помогут подобрать этому явлению правильное название )

Алексей Алексеевич
ваши великолепные эмоции точно не помогут подобрат...

Уже помогли. Вы вообще разбираетесь, как работают современные планировщики запросов, хотя бы минимально? Если нет — то, что Вы пишете, в общем случае противоречит даже базовым принципам их функционирования, просто для информации.

Алексей-Алексеевич Автор вопроса
Yaroslav Schekin
Уже помогли. Вы вообще разбираетесь, как работают ...

на каждый хитрый планировщик, как показывает практика, найдется ленивый изобретательный эмо-программист

Алексей-Алексеевич Автор вопроса
Konstantin Zaitsev
Мы все не видим явления кроме ваш слов

жаль, я старался.. в любом случае спасибо!

ну, справедливости ради, есть исключение: если соединений столько, что включился geqo, тогда... :)

Ilya Portnov
ну, справедливости ради, есть исключение: если сое...

В моём сообщении жирным чёрным по белому было написано: > в типичных случаях (когда осуществляется полный перебор всех возможных планов) между прочим. ;)

Ilya Portnov
ну, справедливости ради, есть исключение: если сое...

Да, кстати — при default настройках geqo на практике не включается никогда (нет, если кому-то удастся написать запрос с 60 (или более?) JOINs, то...).

Yaroslav Schekin
Да, кстати — при default настройках geqo на практи...

geqo_threshold вроде по дефолту "всего" 12. Много, но не безумно много.

Ilya Portnov
geqo_threshold вроде по дефолту "всего" 12. Много,...

И это не имеет значения, потому что from_collapse_limit и join_collapse_limit по умолчанию меньше. Т.е. в норме он в самом деле никогда не включается (и я даже не уверен насчёт "более 60" — это надо в свои записи подсмотреть...).

Yaroslav Schekin
И это не имеет значения, потому что from_collapse_...

т.е. geqo_threshold применяется уже после того как "поколлапсили" в соответствии с *_collapse_limit? так-то они оба по дефолту равны 8. Я это понимал так, что если таблиц больше 12, то включаем geqo, а иначе начинаем что-то там коллапсировать...

Да, после. Я могу подробности потом поискать, если интересует...

Yaroslav Schekin
Да, после. Я могу подробности потом поискать, если...

Очень интересная информация, в доке такого не нашёл, а жаль

Алексей-Алексеевич Автор вопроса
Ilya Portnov
т.е. geqo_threshold применяется уже после того как...

в запросе с прода 10 join, но их столько же и остается, однако запрос с саб-селектом выполняется 0.38сек, без саб-селекта 1мин30сек+, я вижу проблему именно в порядке select ... join ... where

Алексей Алексеевич
в запросе с прода 10 join, но их столько же и оста...

замените названия таблиц и/или полей, если там уж что-то шибко секретное, и покажите запросы и их планы до и после. а так...

Алексей Алексеевич
в запросе с прода 10 join, но их столько же и оста...

Без норм запроса или норм примера который 1 в 1 с вашим запросом тяжело что то сказать. Не можете ваш код с прода - ок. Накидайте свой пример. Выше правильно сказали. Это либо настройки дурные Либо в join чето теряется или вы подзапросом что то теряете...

Алексей Алексеевич
в запросе с прода 10 join, но их столько же и оста...

Либо где-то в join некорректное условие, например идет условие на неравнозначные поля ( если речь идет про констрэинт )

Денис
Либо где-то в join некорректное условие, например ...

А подзапросом вы условно правильно отбираете часть данных

Оно там не можэт возвращаться в join_collapse_limit потому, что это ужэ subquery и они считаются по from_collapse_limit?

Алексей Алексеевич
в запросе с прода 10 join, но их столько же и оста...

Вот, наконец-то какая-то конкретика! Вот это уже может быть причиной построения других планов (но Ваш вывод от этого правильным не становится, между прочим). Но вместо того, чтобы переписывать, Вы просто могли бы увеличить from_collapse_limit и join_collapse_limit до 12 (смело), и забыть об этой проблеме. И да, если есть ещё более сложные запросы — эти параметры (с соответствующим увеличением geqo_threshold) можно на современном железе запросто ставить и 14, а если хочется попробовать GEQO — то его можно оставить default, а сами параметры смело поднять до 20.

Ilya Anfimov
Оно там не можэт возвращаться в join_collapse_limi...

Потому что collapse limits "режут" запрос на planning subproblems такого размера, а geqo включается тогда, когда размер любой из них превышает geqo_threshold, вкратце.

Yaroslav Schekin
Вот, наконец-то какая-то конкретика! Вот это уже м...

а почему внесение условия в подзапрос может повлиять на порядок соединений?

P
Очень интересная информация, в доке такого не нашё...

(Ради справедливости) А я вот нашёл, причём даже дважды: В описании from_collapse_limit и в описании join_collapse_limit: "Setting this value to geqo_threshold or more may trigger use of the GEQO planner, resulting in non-optimal plans." Чёрным по белому, нет? ;)

Ilya Portnov
а почему внесение условия в подзапрос может повлия...

Потому что: from_collapse_limit (integer) The planner will merge sub-queries into upper queries if the resulting FROM list would have no more than this many items.

Yaroslav Schekin
Потому что collapse limits "режут" запрос на plann...

Я не про геко, я про то, что оно могло сильно по-другому попезаться из-за переноса кое-чего с join_* во from_* .

Ilya Anfimov
Я не про геко, я про то, что оно могло сильно по-д...

Так он не переносил, вроде бы? Вот https://t.me/pgsql/489459 и вот https://t.me/pgsql/489456 — такое было описание...

Yaroslav Schekin
Так он не переносил, вроде бы? Вот https://t.me/pg...

По-моему как раз перенёс. Из просто JOIN в sub-select. Впрочем, да, эти все гадания, конечно, непродуктивны абсолютно. Человек, неумеющий пользоваться инжэнерным инструментарием — всё равно будет страдать.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта