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

Привет всем! Подскажите пожалуйста, поймал очень странную ситуацию. Есть запрос

с final извлекающий 10млн строк, у него есть фильтр. В случае селективной фильтрации (убираются почти все строки) запрос работает в разы медленней чем при неселективной фильтрации. Планы запросов одинаковые (кроме фильтра), read_rows, read_bytes тоже одинаковые. Но, потребление памяти у медленного запроса в 2 раза выше.

Выглядит очень странным что фильтрация, которая убрала кучу строк, сделала запросу хуже. При этом все вычисления одинаковые. Может кто сталкивался с таким?

15 ответов

17 просмотров

skip index есть? без final также странно ведет?

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
skip index есть? без final также странно ведет?

Без final так же (чуть быстрее, но такая же разница в 2-3раза между запросами). Skip индексов нет.

Lex Kojevnikov
Без final так же (чуть быстрее, но такая же разниц...

а возможно в секции select этой колонки нет? -- это нормально тогда. Представьте у вас таблица размером 100ГБ и 99ГБ из них это одна колонка, если этой колонки не касаться то запрос будет быстрым

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
а возможно в секции select этой колонки нет? -- эт...

В обоих запросах фильтр есть и он затрагивает одинаковые колонки. Просто в одном варианте он оказывается более селективным (медленный вариант) чем в другом. Запрос не содержит limit, т.е. всегда придется обойти до конца.

Lex Kojevnikov
В обоих запросах фильтр есть и он затрагивает один...

ну хз тогда. Надо смотреть DDL таблицы и запрос

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
ну хз тогда. Надо смотреть DDL таблицы и запрос

Спасибо! Попробую покопаться в trace_log если разберусь с ним.

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
ну хз тогда. Надо смотреть DDL таблицы и запрос

Немного раскопал. Деградация производительности происходит когда когда к маленькой таблице джойнится большая. В нашем случае за уменьшение первой таблицы отвечает фильтр. Если условно представить, то выглядит примерно так: Выполняется за 10 секунд. select * from table1 (1млн строк) right join table2 (1млн строк) Выполняется за 30секунд select * from table1 (10тыс строк) right join table2 (1млн строк)

Lex Kojevnikov
Немного раскопал. Деградация производительности пр...

у вас right join у вас всегда table1 джойнится к table2 а limit есть в запросе?

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
у вас right join у вас всегда table1 джойнится к...

limit нет, точнее я его убрал и разницы нет.

Lex Kojevnikov
limit нет, точнее я его убрал и разницы нет.

покажите статистику 2х запросов эту : Elapsed: 0.008 sec. Processed 18.19 thousand rows, 317.46 KB (2.17 million rows/s., 37.89 MB/s.)

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
покажите статистику 2х запросов эту : Elapsed: 0....

Селективный и медленный: Elapsed: 48.898 sec. Processed 19.16 million rows, 6.70 GB (391.92 thousand rows/s., 137.01 MB/s.) Неселективный и быстрый: Elapsed: 15.081 sec. Processed 19.18 million rows, 6.71 GB (1.27 million rows/s., 445.11 MB/s.) Первый очень долго висел на 99%, но, кажется это нормально.

Lex Kojevnikov
Селективный и медленный: Elapsed: 48.898 sec. Proc...

ну попробуйте set join_algorithm = 'hash' и выполните запросы

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
ну попробуйте set join_algorithm = 'hash' и выполн...

Пробовал, кажется даже все алгоритмы. Разница не очень ощутима.

Lex Kojevnikov
Пробовал, кажется даже все алгоритмы. Разница не о...

если на left join переделать и поменять таблицы местами?

Lex-Kojevnikov Автор вопроса
Denny [Altinity]
если на left join переделать и поменять таблицы ме...

То же самое. Попробовал полностью обнулить запрос первой таблицы, стало еще чуть медленней.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно 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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта