использование CURRENT_DATE увеличивает время выполнения

Модераторы: kdv, CyberMax

Ответить
zubastik
Сообщения: 6
Зарегистрирован: 20 апр 2010, 10:17

использование CURRENT_DATE увеличивает время выполнения

Сообщение zubastik » 11 фев 2015, 11:45

версия сервера 1.5 classic

была процедура использующая следующий запрос

Код: Выделить всё

select tarif_price_month , count(xc_product.product_id), xc_product.product_id
     from xc_product inner join xc_tarif on xc_product.product_id = xc_tarif.product_id
     where kab = :kab
           and product_start <= current_date
           and product_stop > current_date
           and (product_pause > current_date or product_pause is null)
           and tarif_minus  = 0
           and tarif_arenda = 0
           and tarif_percent = 0
     group by tarif_price_month , xc_product.product_id
время выполнения в среднем 2.8-3.8 секунды
методом "научного тыка" выяснил , что если не использовать функцию current_date, а передавать текущую дату из приложения в качестве входной переменной, то скорость выполнения процедуры увеличивается до 300-400 мс, т.е. почти в 10 раз быстрее!!!

чем вызвано такое поведение?

переписал на

Код: Выделить всё

select tarif_price_month , count(xc_product.product_id), xc_product.product_id
     from xc_product inner join xc_tarif on xc_product.product_id = xc_tarif.product_id
     where kab = :kab
           and product_start <= '11.02.2015'
           and product_stop > '11.02.2015'
           and (product_pause > '11.02.2015' or product_pause is null)
           and tarif_minus  = 0
           and tarif_arenda = 0
           and tarif_percent = 0
     group by tarif_price_month , xc_product.product_id

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: использование CURRENT_DATE увеличивает время выполнения

Сообщение Dimitry Sibiryakov » 11 фев 2015, 14:51

Планы сравнивай.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: использование CURRENT_DATE увеличивает время выполнения

Сообщение kdv » 11 фев 2015, 17:07

во-первых да, неплохо бы сравнить планы запросов.
А во-вторых, внутри процедур current_date, current_time, current_timestamp вычисляются только при первом вызове, а дальше значение не меняют.
Поэтому эксперимент можно было провести так
declare variable dt date;
...

dt:=current_date;
а дальше в запросе уже использовать :dt.

zubastik
Сообщения: 6
Зарегистрирован: 20 апр 2010, 10:17

Re: использование CURRENT_DATE увеличивает время выполнения

Сообщение zubastik » 12 фев 2015, 08:21

kdv писал(а):во-первых да, неплохо бы сравнить планы запросов.
планы абсолютно одинаковые
kdv писал(а):dt:=current_date;
а дальше в запросе уже использовать :dt.
тоже в результате так сделал. Просто интересно, почему использование данной функции так замедляет запрос

Ответить