|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
Здравствуйте. Экспериментальным способом определил, что селект тормозит из за coalesce . Вот собственно селект который выполняется порядка 12 минут: 1) select d.* from data_9000 d where d.god=2017 and d.mes=12 and d.oktmo in (select coalesce(g.code, -1) as code from s_oktmo_g g where g.oktmo in (select coalesce(s.oktmo,-1) from s_oktmo2017 s where coalesce(s.priz_viborky,0)=1)); А вот этот же селект без coalesce который выполняется меньше чем за 1 секунду. 2) select d.* from data_9000 d where d.god=2017 and d.mes=12 and d.oktmo in (select g.code from s_oktmo_g g where g.oktmo in (select s.oktmo from s_oktmo2017 s where coalesce(s.priz_viborky,0)=1)); у таблицы s_oktmo есть индекс по столбцу oktmo; у таблицы s_oktmo_g есть индекс по столбцу code и oktmo; у таблицы data_9000 пока нет индекса, но суть не в этом. Приложил графики из Performance Analysis левый от первого селекта правый от второго. С чего такое поведение селектов? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 08:06 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
Забыл написать про сервер. Стоит Firebird 2.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 08:17 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
SlobAn, попробуй приведение типов CAST'ом сделать CAST(coalesce() as ) чтоб результат COALESCE был того же типа, что и поле ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 09:00 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
ФБ превращает некоррелированный IN в коррелированный EXISTS. При этом внутри подзапроса возникает условие вида d.oktmo = coalesce(g.code, -1) и наличие COALESCE делает невозможным использование индекса по таблице внутри подзапроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 09:01 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
dimitr, + Точно так. Проверил свою версию - я был неправ, не поможет. И наоборот - обрамление поля, используемого в условии IN в coalesce привело к использованию натурального перебора вместо индекса на аналогичного вида запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 09:16 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
Миллиард (почти) неиндесных чтений -это во-первых красиво... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 09:29 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
IN - не наш метод. Мысли на соединения перескакивают непроизвольно. Что-то типа такого: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 10:21 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 11:40 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
спасибо за расъяснение. Получается лучше избегать таких ситуаций? А что насчет просто перечислений в in например: oktmo in (1000,1001,1002) - такие перечисления думаю не будут тормозить. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 11:44 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
SlobAn, Такое условие преобразуется в "oktmo = 1000 or oktmo = 1001 or oktmo = 1002" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 11:49 |
|
Почему селект тормозит из-за coalesce
|
|||
---|---|---|---|
#18+
SlobAnспасибо за расъяснение. Получается лучше избегать таких ситуаций? А что насчет просто перечислений в in например: oktmo in (1000,1001,1002) - такие перечисления думаю не будут тормозить. Проблема в ограниченном количестве элементов под оператором in. И в невозможности впихнуть это всё в один запрос. Как было сказано "in - это не наш путь". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2017, 14:31 |
|
|
start [/forum/topic.php?fid=40&msg=39498799&tid=1561473]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 149ms |
0 / 0 |