Время ожидания ALTER TABLE NOCHECK CONSTRAINT случайно - PullRequest
0 голосов
/ 14 января 2011

У меня есть приложение C #, которое выполняет процесс ETL.Для таблицы с самоссылкой приложение будет запускать «ALTER TABLE [tableName] NOCHECK CONSTRAINT [constraintName]», которое отключает любую проверку ограничений FK для этой таблицы.Как только все данные загружены, ограничения снова активируются.

Тайм-аут базы данных установлен на 3 минуты, однако приведенная выше команда SQL не будет выполнена из-за истечения времени ожидания базы данных через 30 секунд.

В чем может быть причина этого тайм-аута?

Существуют ли системные таблицы базы данных, которые я должен проверить на ненормальность?

Другая информация: я проверил приложение, в нем только один активныйпоток делает ETL, поэтому я не думаю, что приложение блокирует какой-либо ресурс базы данных.Кроме того, база данных работает на том же компьютере, что и приложение.

Если приложение закроет все свои подключения к базе данных, оно снова остановится, если запустит процесс ETL в следующий раз.Если я запускаю sql вручную с помощью SQL Manager Studio, у него не возникает никаких проблем.

Спасибо

ОБНОВЛЕНИЕ - Приложение отключает ряд ограничений.Оказывается, тайм-аут происходит только с 1 конкретным ограничением.Это ограничение ссылается на таблицу «Измерение даты».

ОБНОВЛЕНИЕ - Похоже, что в тестовой базе данных, над которой я работал, есть какая-то странная ненормальность.Я попробовал тот же самый процесс ETL с другим хранилищем данных, и у него пока нет проблем.Другие разработчики в команде также не сталкивались с этой проблемой.Это приложение работает каждую полночь.Я буду продолжать работать в течение ночи и, надеюсь, смогу воспроизвести ту же проблему в других базах данных.Пока не повезло в выяснении того, что происходит.

1 Ответ

2 голосов
/ 14 января 2011

Изменение таблицы требует эксклюзивной блокировки для таблицы.Если есть другой процесс чтения / записи в рассматриваемой таблице, изменение схемы не может иметь место, пока этот процесс не снимет свою блокировку.

Когда вы испытываете долгое время выполнения для таблицы, запустите sp_who2 вдругое соединение и посмотрите, не блокируют ли какие-либо соединения ваше соединение ETL.Затем вы можете посмотреть на буфер команд для этого соединения, чтобы определить, что оно делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...