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

Откуда:
Сообщений: 165
Здравствуйте,
недавно начал разбираться с Execution Plan'ом.
Сразу возник вопрос, почему делается именно так а не иначе.
Пример:

if (OBJECT_ID('tempdb..#table')>1) drop table #table
create table 
    #table (   
        ID      int identity(1,1) primary key clustered, 
        field1  nvarchar(40), 
        field2  int )

--create clustered index idx_ID on #table (ID)

insert #table (field1, field2)
select '0', 1
union 
select 'code1', 1

declare @pID    int,
        @pCode  varchar(40)

-- first variant
select @pID = 1, @pCode = null        
select  ID,
        field1,
        field2 
from #table
where ID = @pID

-- second variant
select @pID = null, @pCode = '0'
select  ID,
        field1,
        field2 
from    #table
where   ID = @pID 
    or  (   @pID is null
        and field1 = @pCode )

-- third variant
select @pID = 1, @pCode = null        
select  ID,
        field1,
        field2 
from #table
where ID = @pID        
    or  (   @pID is null
        and field1 = @pCode )

1 вариант - все ок, на плане 'Clustered Index Seek'. В запросе фильтруем по кластерному индексу.
2 вариант - так же все ок, на плане 'Clustered Index Scan'. В запросе не фильтруем по кластерному индексу.
3 вариант - Почему то выбирается 'Clustered Index Scan', хотя вроде бы должен быть Seek.... я думаю что это из за OR

Но тогда как нужно перестроить запрос, чтобы:
1. либо ID = @pID и на плане Clustered Index Seek
2. либо ID = null and field1 = @pCode и на плане Clustered Index Scan
12 июл 11, 19:40    [10964031]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
либо if, либо union all
12 июл 11, 19:57    [10964079]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Не уловил мысли. Можно чуточку по-подробней?
13 июл 11, 12:10    [10966535]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
whitebeast
Не уловил мысли. Можно чуточку по-подробней?


union all

select @pID = 1, @pCode = null        
select  ID,
        field1,
        field2 
from #table
where ID = @pID        
union all
select @pID = 1, @pCode = null        
select  ID,
        field1,
        field2 
from #table
where @pID is null
  and field1 = @pCode )

if
if @ID is not null
begin
end
else
begin
end
13 июл 11, 12:15    [10966558]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Хм.. А без таких кардинальных переделок никак не обойтись? Не хочется как то дублировать код...
13 июл 11, 13:10    [10966975]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
whitebeast
Хм.. А без таких кардинальных переделок никак не обойтись? Не хочется как то дублировать код...
Динамический sql. Но там свои тараканы.

'Кардинальные переделки' - ИМХО - правильнее.
13 июл 11, 13:20    [10967049]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Динамический SQL сразу в топку )

Другой вопрос стоят ли они этого. Стоимость выполнения процедуры 0,003

Как считаете нужно заморачиваться?
13 июл 11, 13:22    [10967073]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
whitebeast
Другой вопрос стоят ли они этого. Стоимость выполнения процедуры 0,003

Как считаете нужно заморачиваться?

Это пока данные в табличке помещается в 1 страницу, стоимость Clustered Index Scan - 0,003. А если с течением времени там 100500 страниц наберется? И стоимость запроса и время выполнения возрастут на порядки. Нужно ли с этим заморачиваться - решать только вам. :)
13 июл 11, 13:31    [10967164]     Ответить | Цитировать Сообщить модератору
 Re: Почему именно такой Execution Plan?  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Спасибо за инфу!
Пока гляну на другие процедуры :) Думаю найду что поправить. Эту же оставлю на потом )
13 июл 11, 13:43    [10967279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить