powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему селект тормозит из-за coalesce
11 сообщений из 11, страница 1 из 1
Почему селект тормозит из-за coalesce
    #39498751
SlobAn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Экспериментальным способом определил, что селект тормозит из за 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 левый от первого селекта правый от второго.

С чего такое поведение селектов?
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498756
SlobAn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл написать про сервер. Стоит Firebird 2.5.
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498784
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SlobAn, попробуй приведение типов CAST'ом сделать
CAST(coalesce() as )
чтоб результат COALESCE был того же типа, что и поле
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498785
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФБ превращает некоррелированный IN в коррелированный EXISTS. При этом внутри подзапроса возникает условие вида d.oktmo = coalesce(g.code, -1) и наличие COALESCE делает невозможным использование индекса по таблице внутри подзапроса.
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498799
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr, +
Точно так. Проверил свою версию - я был неправ, не поможет.
И наоборот - обрамление поля, используемого в условии IN в coalesce привело к использованию натурального перебора вместо индекса на аналогичного вида запросе.
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498804
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миллиард (почти) неиндесных чтений -это во-первых красиво...
:)
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498839
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IN - не наш метод.
Мысли на соединения перескакивают непроизвольно.
Что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select d.*
  from data_9000 d
       join (select distinct coalesce(g.code, -1) as code
               from s_oktmo2017 s
                    join s_oktmo_g g on g.oktmo = coalesce(s.oktmo, -1)
	       where coalesce(s.priz_viborky, 0) = 1) g
       on g.code = d.oktmo
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498903
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498907
SlobAn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за расъяснение.
Получается лучше избегать таких ситуаций?
А что насчет просто перечислений в in например: oktmo in (1000,1001,1002) - такие перечисления думаю не будут тормозить.
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39498912
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SlobAn,

Такое условие преобразуется в "oktmo = 1000 or oktmo = 1001 or oktmo = 1002"
...
Рейтинг: 0 / 0
Почему селект тормозит из-за coalesce
    #39499041
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SlobAnспасибо за расъяснение.
Получается лучше избегать таких ситуаций?
А что насчет просто перечислений в in например: oktmo in (1000,1001,1002) - такие перечисления думаю не будут тормозить.
Проблема в ограниченном количестве элементов под оператором in. И в невозможности впихнуть это всё в один запрос. Как было сказано "in - это не наш путь".
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему селект тормозит из-за coalesce
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]