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

Откуда:
Сообщений: 31
Запрос
select 
 *
 from tab
  where id = 1
исполняется 1 секунду.
Запрос
declare @const int = 1
select 
 *
 from tab
  where id = @const
исполняется 40 секунд.
Кто виноват, что делать?
28 окт 13, 14:56    [15041547]     Ответить | Цитировать Сообщить модератору
 Re: Кто виноват, что делать?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Смотреть планы запросов.
Анализировать селективность условия id = @const для разных значений @const.
28 окт 13, 15:06    [15041598]     Ответить | Цитировать Сообщить модератору
 Re: Кто виноват, что делать?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А [id] поди и не Int даже
28 окт 13, 19:26    [15042940]     Ответить | Цитировать Сообщить модератору
 Re: Кто виноват, что делать?  [new]
imato
Member

Откуда: Москва
Сообщений: 80
Гость333
Смотреть планы запросов.
Анализировать селективность условия id = @const для разных значений @const.


Чтобы было понятнее.
Наверняка ваш второй запрос часть какой-то процедуры скомпилированной с другим значением переменной, при которой выбирается большее количество строк и при этом индекс не используется.
Попробуйте добавить к запросу оптимизацию.
http://technet.microsoft.com/ru-ru/library/ms181714.aspx
OPTION ( OPTIMIZE FOR (@var UNKNOWN) );
29 окт 13, 09:57    [15044707]     Ответить | Цитировать Сообщить модератору
 Re: Кто виноват, что делать?  [new]
Exproment
Member

Откуда:
Сообщений: 416
i-n-d-e-x, во втором примере вы используете параметризованный запрос. В которых кардинальность оценивается "для общего случая". В то время как в первом запросе - для частного случая id=1 => в первом случае у вас оценка будет лучше, чем во втором.

Если вы второй запрос обернете в процедуру и первый вызов сделаете
exec proc @id = 1
, то получите выполнение запроса, аналогичное первому примеру. А все потому, что скомпилируете процу для своего частного случая. Точно так-же, если во втором запросе добавите хинт OPTIMIZE FOR для @id=1, то получите аналогичный результат(опять, потому что кардинальность будет оцениваться для частного случая).

ЗЫ: читайте про параметризованные запросы и оценку кардинальности(estimated rows) в запросах.
29 окт 13, 11:11    [15045276]     Ответить | Цитировать Сообщить модератору
 Re: Кто виноват, что делать?  [new]
i-n-d-e-x
Member

Откуда:
Сообщений: 31
Всем спасибо. Очень помогло.
24 май 14, 23:50    [16066977]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить