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

Есть план выполнения update запроса обновляющего ключ не уникального индекса:
use tempdb
go

if object_id('test_upd') > 0
drop table test_upd
create table test_upd(id int identity, id2 int, constraint pk primary key(id))
create index ni_id2 on test_upd(id2)
insert into test_upd (id2) values (1)
go

set showplan_all on
go
update test_upd set id2 = 100
go
set showplan_all off
go


|--Clustered Index Update(OBJECT:([tempdb].[dbo].[test_upd].[pk]), OBJECT:([tempdb].[dbo].[test_upd].[ni_id2]), SET:([tempdb].[dbo].[test_upd].[id2] = [Expr1006]))
       |--Compute Scalar(DEFINE:([Expr1007]=[Expr1007]))
            |--Compute Scalar(DEFINE:([Expr1007]=CASE WHEN [Expr1004] THEN (0) ELSE (1) END))
                 |--Compute Scalar(DEFINE:([Expr1006]=(100)))
                      |--Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [tempdb].[dbo].[test_upd].[id2] = (100) THEN (1) ELSE (0) END))
                           |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[test_upd].[pk]))


Как видно из плана Clustered Index Update использует Expr1006, но не могу понять как он использует значение Expr1007.
Правильно ли я понимаю, что из плана нельзя увидеть того как оператор Clustered Index Update использует значение Expr1007?
Заранее благодарю за ответы.
9 окт 17, 19:41    [20855779]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору Compute Scalar для Update запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Вероятный,

К сожалению, план часто недостаточно информативен. Но я могу вам сказать что это такое.
У вас построчный план обновления per row/narrow plan), сервер обновляет таблицу построчно для каждого индекса. Кластерный индекс, далее некластерный по id2. Но зачем его (ключ некластерного индекса) обновлять, если обновляемое значение равно тому значению, на которое обновляется, т.е. если 100 = 100. Сервер это проверяет, предварительно вычисляя в CASE, равно ли id2 значению 100.

Можете увидеть эту проверку, если форсировать поиндексный (per index or wide plan) план.
...
update test_upd set id2 = 100 option(querytraceon 8790);
...


К сообщению приложен файл. Размер - 54Kb
9 окт 17, 22:58    [20856132]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить