2012-06-22 4 views
2

Мы используем секционированные представления (стандартный SQL Server 2008, секционированные таблицы не являются параметрами), и они отлично работают, если мы рассмотрим цель исключения разделов: если мы запустим запрос в секционированном представлении с указанием предложение о столбце, который мы выбираем в качестве дискриминатора, мы можем видеть из фактического плана выполнения, что удаляется только таблица, связанная с указанным значением дискриминатора. Но мы сталкиваемся с проблемами блокировки, если есть параллельные инструкции INSERT или UPDATE, даже если они не попадают в таблицу, выбранную дискриминатором.Разделенные представления и блокировка SQL Server

Анализ блокировок. Я вижу, что даже если план выполнения показывает, что считывается только одна правая таблица, блокировки IS по-прежнему помещаются во ВСЕХ таблицах в секционированном виде, и, конечно, если кто-то уже поставил X блокирует один из них, весь запрос, запущенный в секционированном представлении, блокируется на этом, даже если таблица с X по-прежнему не читается.

Является ли это ограничением секционированного представления вообще, или есть способ избежать этого, придерживаясь секционированных представлений? Мы создали секционированное представление и связанные с ним вещи, следуя рекомендациям SQL Server Books Online.

Благодаря

Оса

ответ

2

Это дизайн. Не блокируйте X целых таблиц.

+0

Мы не выполняем блокировку X во всех таблицах, что происходит во время операции MERGE внутри транзакции без явных указаний на блокировку. – Wasp

+0

К сожалению, вы ничего не можете сделать, кроме добавления подсказок NOLOCK к представлению. –

+1

Вы можете перейти [Как устранить проблемы блокировки, вызванные эскалацией блокировки в SQL Server] (http://support.microsoft.com/kb/323630), чтобы предотвратить блокировку X ('-T1211') –