Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / WHERE (@ID=0 OR ID=@ID) не используется индекс по ID / 5 сообщений из 5, страница 1 из 1
22.06.2002, 00:56:41
    #32033526
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WHERE (@ID=0 OR ID=@ID) не используется индекс по ID
Мне в SP нужно вернуть либо все записи из AgentRep либо только записи с определенным AgentCompanyID в зависимости от @AgentCompanyID:
(примерно так)
Код: plaintext
1.
2.
3.
4.
5.
CREATE PROCEDURE SP_Test
    @AgentCompanyID int= 0 
AS
SELECT r.* FROM AgentRep r 
WHERE (@AgentCompanyID= 0  OR AgentCompanyID=@AgentCompanyID)


А если сравнить с таким запросом:

Код: plaintext
1.
SELECT r.* FROM AgentRep r 
WHERE (AgentCompanyID=@AgentCompanyID)


то наблюдается неприятная картина: cost первого и второго запроса соотв. 76% и 24%

Первый запрос выполняется с Clustered Index Scan по AgentRep, второй использует существующий индекс по AgentCompanyID для таблицы AgentRep - что естественно гораздо быстрее.

Вопрос, а почему ? И как этого избежать ?
...
Рейтинг: 0 / 0
22.06.2002, 02:08:00
    #32033527
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WHERE (@ID=0 OR ID=@ID) не используется индекс по ID
Почему бы не использовать такой код?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER PROCEDURE SP_Test
  @AgentCompanyID int =  0 
AS
set nocount on
if @AgentCompanyID= 0 
  SELECT r.* FROM AgentRep r 
else
  SELECT r.* FROM AgentRep r 
   WHERE AgentCompanyID = @AgentCompanyID
return  0 
GO
...
Рейтинг: 0 / 0
22.06.2002, 02:40:44
    #32033529
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WHERE (@ID=0 OR ID=@ID) не используется индекс по ID
В простейшем случае - Да. А как быть если таких параметров несколько? Скажем 3 или больше ? Все комбинации не пропишешь, однако.
...
Рейтинг: 0 / 0
22.06.2002, 15:08:50
    #32033538
maximF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WHERE (@ID=0 OR ID=@ID) не используется индекс по ID
Для явного указания на использование индекса можно использовать with (index(index_name)) в select .
Правда, таким способом нельзя выбирать нужный индекс в зависимости от значения переменных. Но скорее всего это невозможно, так как план выполнения запроса строится при отсутствии информации о значении переменных.
Можно строить текст запроса динамически, но этот способ имеет свои недостатки.
...
Рейтинг: 0 / 0
24.06.2002, 09:08:09
    #32033579
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WHERE (@ID=0 OR ID=@ID) не используется индекс по ID
Да, я проверил - при динамическом запросе индекс используется. Осталось разобраться чтоже хуже - динамический запрос но с инжексом или обычный но без индекса ?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / WHERE (@ID=0 OR ID=@ID) не используется индекс по ID / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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