Страница 1 из 1

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

Добавлено: 11 фев 2015, 11:45
zubastik
версия сервера 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

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

Добавлено: 11 фев 2015, 14:51
Dimitry Sibiryakov
Планы сравнивай.

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

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

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

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

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