Сравнение схемы SSDT не работает, пока выполняется BULK INSERT

11

Я работаю над большим проектом ETL и DW, где мы используем TFS / контроль исходного кода вместе с SSIS и SSDT.

Сегодня я обнаружил, что хотя пакет служб SSIS выполняет BULK INSERT в таблице базы данных, невозможно выполнить сравнение схемы SSDT с этой базой данных. Это прискорбно, так как некоторые из наших пакетов занимают достаточно много времени. Мы хотим использовать функцию сравнения схем для обнаружения изменений в структуре базы данных, чтобы сохранить их в нашем проекте SSDT для контроля версий базы данных.

Посмотрев немного подробнее, я обнаружил, что функция сравнения схем в SSDT выполняет сценарий SQL, который вызывает OBJECTPROPERTY()системную функцию для таблиц в базе данных. В частности, в моем случае любые вызовы, по- OBJECTPROPERTY(<object_id>, N'IsEncrypted')видимому, блокируются, когда <object_id>речь идет о таблице, которая в настоящее время массово вставляется.

В Visual Studio схема сравнения SSDT просто отключается через некоторое время и утверждает, что никаких различий не обнаружено.

Есть ли обходной путь к этой проблеме в SSDT, или я должен попытаться подать отчет об ошибке MS Connect?

В качестве альтернативы, поскольку BULK INSERT происходит из пакета OBJECTPROPERTYслужб SSIS, возможно, существует какой-либо способ сделать эту вставку без блокировки -calls на таблице? Редактировать: В пунктах назначения SSE OLE DB мы можем убрать галочку из «Таблицы блокировок», которая делает то, что говорит, но это может снизить производительность в некоторых ситуациях. Меня гораздо больше интересует решение, которое позволяет SSDT Schema Compare выполнять свою работу, даже если некоторые объекты заблокированы.

Дэн
источник
Взгляните на Управление поведением блокировки для группового импорта - у вас может быть включена «блокировка таблицы при массовой загрузке». Также убедитесь, что в BULK INSERT не указано TABLOCK
stuartd
Если вы берете на себя блокировку таблиц, вы можете найти загрузку быстрее, если ее все равно отключите ( technet.microsoft.com/en-us/library/ms177445.aspx ) - независимо от причины, по которой я бы поднял соединение, потому что время ожидания должно по крайней мере, провал, а не просто сказать, что нет никаких изменений
Эд Эллиотт
Спасибо за ответы, Стюарт и Эд Эллиот. Оказывается, мы действительно хотим заблокировать таблицу по соображениям производительности. По моему мнению, SSDT должен быть в состоянии справиться с этим, потому что мы хотим только сравнивать базу данных, а не применять изменения к объектам в базе данных. Я создам сообщение для подключения, чтобы решить эту проблему.
Дан
3
Внутренние органы не моя сильная сторона, но, насколько я понимаю, у вас есть замок на столе. Независимо от того, какая блокировка используется для массовой вставки, она несовместима с блокировкой (-ями), необходимой для проверки схемы. Соответствующее чтение BOL Схема блокировки
billinkc
Не могли бы вы лучше объяснить, почему сравнение схем должно выполняться параллельно с операцией загрузки? Возможно, альтернативой является опорная модель базы данных. Нет данных, только схема. Проведите сравнение с этим, а затем убедитесь, что никто не изменяет фактическую базу данных, в которой выполняются эти массовые операции, без предварительного обновления эталонной модели.
billinkc

Ответы:

19

Для OBJECTPROPERTYвызова требуется блокировка стабильности схемы (Sch-S), которая несовместима только с блокировкой модификации схемы (Sch-M).

В BULK INSERTнекоторых обстоятельствах будет взята блокировка Sch-M. Они перечислены в разделе «Блокировка таблиц и ведение журналов при массовом импорте» Руководства по оптимизации массового импорта в электронных книгах:

Блокировка массового импорта

Если таблица назначения кластеризована, вы можете найти включающий флаг трассировки 610 подсказок. Пожалуйста, прочитайте всю серию этих постов и Руководство по производительности загрузки данных и тщательно протестируйте, если вы решите пойти по этому пути.

Я понятия не имею, почему SSDT проверяет IsEncryptedсвойство для таблиц. Я не могу представить сценарий, где это имеет смысл, но это вопрос для людей SSDT.

Пол Уайт 9
источник
3
Это был очень полный и удовлетворительный ответ. Большое спасибо.
Дан