Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему селект тормозит из-за coalesce / 11 сообщений из 11, страница 1 из 1
02.08.2017, 08:06
    #39498751
SlobAn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
Здравствуйте.

Экспериментальным способом определил, что селект тормозит из за 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
02.08.2017, 08:17
    #39498756
SlobAn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
Забыл написать про сервер. Стоит Firebird 2.5.
...
Рейтинг: 0 / 0
02.08.2017, 09:00
    #39498784
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
SlobAn, попробуй приведение типов CAST'ом сделать
CAST(coalesce() as )
чтоб результат COALESCE был того же типа, что и поле
...
Рейтинг: 0 / 0
02.08.2017, 09:01
    #39498785
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
ФБ превращает некоррелированный IN в коррелированный EXISTS. При этом внутри подзапроса возникает условие вида d.oktmo = coalesce(g.code, -1) и наличие COALESCE делает невозможным использование индекса по таблице внутри подзапроса.
...
Рейтинг: 0 / 0
02.08.2017, 09:16
    #39498799
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
dimitr, +
Точно так. Проверил свою версию - я был неправ, не поможет.
И наоборот - обрамление поля, используемого в условии IN в coalesce привело к использованию натурального перебора вместо индекса на аналогичного вида запросе.
...
Рейтинг: 0 / 0
02.08.2017, 09:29
    #39498804
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
Миллиард (почти) неиндесных чтений -это во-первых красиво...
:)
...
Рейтинг: 0 / 0
02.08.2017, 10:21
    #39498839
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
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
02.08.2017, 11:40
    #39498903
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
...
Рейтинг: 0 / 0
02.08.2017, 11:44
    #39498907
SlobAn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
спасибо за расъяснение.
Получается лучше избегать таких ситуаций?
А что насчет просто перечислений в in например: oktmo in (1000,1001,1002) - такие перечисления думаю не будут тормозить.
...
Рейтинг: 0 / 0
02.08.2017, 11:49
    #39498912
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему селект тормозит из-за coalesce
SlobAn,

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


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