Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
имеем два абсолютно одинаковых запроса....
один построен через view
второй напрямую через таблицы
различаются запросы только этими строками

--это
--рег.Date_Time_IDDoc > @Остатки_НачДатаДвижений AND рег.Date_Time_IDDoc < @Остатки_КонДатаДвижений
--заменил на это
--рег.Date_Time_IDDoc > '20080101' AND рег.Date_Time_IDDoc < '20080110AKE240 5TP '

и оптимизатор выровнял время выполнения двух запросов до 50/50
при использовании переменных было 99%/1%

когда вместо переменных напрямую написал текст то стало все как надо
оптимизатор задействовал оптимальный индекс

чем это объяснить? и как исправить.
16 ноя 09, 08:37    [7931789]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
Комаров Сергей,

забыл добавить
SQL 2000
16 ноя 09, 09:37    [7931883]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
1) Обновить статистику
2) Хинт witx(INDEX)
16 ноя 09, 09:49    [7931921]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
--__Александр__--,

статистика обновлена,
ХИНТ ИНДЕКС - невозможен, ибо запрос строится по VIEW
16 ноя 09, 09:51    [7931928]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
Комаров Сергей,

проблему я решил путем замены переменных явным указанием дат и периодов, но все же интересно такое поведение...сервака
16 ноя 09, 09:52    [7931937]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Bлoм рeгистpиpовaтьcя
Guest
Комаров Сергей,

объясняется это тем, что у запросов разные планы. В одном случае подбирается план под разные комбинации параметров, в другом запрос всегда один и тот же. Разбирайтесь с индексами на таблице.
16 ноя 09, 09:55    [7931947]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
Bлoм рeгистpиpовaтьcя,

то что замиедление из за разных планов - это я как раз и понял.
именно там я и увидел что разные индексы задействованы....

но я не подумал что оптимизатор в случае переменной "не знает" ЧТО ИМЕННО в ней может прийти
и поэтому "на всякий случай" берет кластерный индекс...

если так и есть, то!!!
как успокоить "оптимизатор" что в переменной в данном случае придет именно то, что надо для оптимального индекса, что бы он не волновался
16 ноя 09, 10:08    [7932001]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
попробуйте запрос с переменными оформить как процедуру:
create proc ...
    @Остатки_НачДатаДвижений
    ...
as
set nocount on

declare
    @НачДатаДвижений

select
    @НачДатаДвижений=@Остатки_НачДатаДвижений

select
        ...
    from
       ...
    where
       рег.Date_Time_IDDoc > @НачДатаДвижений AND ...
--------------------------------------------------------------
Дьявол кроется в деталях.
16 ноя 09, 10:12    [7932029]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
Комаров Сергей
Комаров Сергей,

проблему я решил путем замены переменных явным указанием дат и периодов, но все же интересно такое поведение...сервака

При наличии констант оптимизатор может сразу использовать их конкретные значения для получения из статистики информации о количестве операций ввода/вывода.
А для переменных оптимизатор этого сделать не может и при создании плана должен опираться на статистику распределения значений в индексе и/или столбце
16 ноя 09, 10:13    [7932031]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
Комаров Сергей
Member

Откуда:
Сообщений: 24
Glory,

спасибо за подробное разъяснение.

теперь все стало ясно.
16 ноя 09, 10:16    [7932055]     Ответить | Цитировать Сообщить модератору
 Re: использование переменных вместо явного указания текста тормозит запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Комаров Сергей,

можете попробовать хинт OPTIMIZE FOR, иногда помогает. Но только если запрос получается применимый для всех параметров.
16 ноя 09, 10:52    [7932289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить