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

Откуда:
Сообщений: 91
Есть искусственно сгенерированный приложением запрос, который сводится в "узком" месте к подзапросу
select
....
from [ActivityPointerBase]
inner join [lv_notificationactivityBase] on ([ActivityPointerBase].[ActivityId] = [lv_notificationactivityBase].[ActivityId] and [ActivityPointerBase].[ActivityTypeCode] = 10042)
....

ActivityPointerBase - таблица с 3 726 767 записями
lv_notificationactivityBase - таблица с 50609 записями

Скриншот графического плана приаттачен, идет Clustered index Scan по маленькой таблице lv_notificationactivityBase и Index Seek к ActivityPointerBase, который повторяется в количестве записей в lv_notificationactivityBase.

Но профайлер по тому же процессу показывает события "Scan Start" "Scan Stop" по ObjectId = ActivityPointerBase в количестве 50609
Эти события после повторения какого то количества раз в конце концов переходят в событие Lock Escalation на всей таблице ActivityPointerBase.
Непонятно, почему Index Seek на плане запроса превращается Scan в трейсе.
Ну и основной вопрос, как предотвратить Lock Escalation.
Как вариант, можно попробовать перевести базу с Isolation Level Read commited на READ_COMMITTED_SNAPSHO

К сообщению приложен файл. Размер - 77Kb
26 мар 15, 18:14    [17436749]     Ответить | Цитировать Сообщить модератору
 Re: Index Seek в плане в профайлере Table Scan  [new]
msLex
Member

Откуда:
Сообщений: 8730
alister
Непонятно, почему Index Seek на плане запроса превращается Scan в трейсе.

у вас seek идет по неуникльному полю, что по своей сути есть ренж скан


alister
Ну и основной вопрос, как предотвратить Lock Escalation.

alter table ... set (lock_escalation = disable)
26 мар 15, 18:23    [17436805]     Ответить | Цитировать Сообщить модератору
 Re: Index Seek в плане в профайлере Table Scan  [new]
SomewhereSomehow
Member

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

Ответ на ваш первый вопрос (про seek/scan):
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/09/14/scan-count-meaning-in-set-statistics-io-output.aspx
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/09/29/scan-count-meaning-in-set-statistics-io-output-part-2.aspx
Там про statistics io, но причина та же.

Ответ на ваш второй вопрос:
https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx
пункт: Reducing Locking and Escalation
26 мар 15, 18:25    [17436821]     Ответить | Цитировать Сообщить модератору
 Re: Index Seek в плане в профайлере Table Scan  [new]
alister
Member

Откуда:
Сообщений: 91
msLex
alister
Непонятно, почему Index Seek на плане запроса превращается Scan в трейсе.

у вас seek идет по неуникльному полю, что по своей сути есть ренж скан


alister
Ну и основной вопрос, как предотвратить Lock Escalation.

alter table ... set (lock_escalation = disable)

ну, про это я думал, даже пробовал сделать, но из-за блокировок пока не прошло
Вроде snapshot isilation тот же результат дает
26 мар 15, 18:31    [17436844]     Ответить | Цитировать Сообщить модератору
 Re: Index Seek в плане в профайлере Table Scan  [new]
alister
Member

Откуда:
Сообщений: 91
SomewhereSomehow
Ответ на ваш второй вопрос:
https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx
пункт: Reducing Locking and Escalation

Да, спасибо
26 мар 15, 18:45    [17436919]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить