Оператор обновления SQL Server 2008 зависает - PullRequest
3 голосов
/ 11 декабря 2011

В моем SQL Server 2008 Enterprise у меня есть база данных, которая содержит несколько таблиц:

  1. Departments - несколько строк
  2. Persons - 300 + - строк
  3. Permissions - тысячи строк

Первичный ключ Persons - это PersonId в сочетании с DepartmentId (который сам является FK).

Таблица Permissions имеет FK с каскадными функциями (удаление, обновление) для PK таблицы Persons.

Когда я выполняю этот оператор:

UPDATE Persons SET PersonId = PersonId + 1 WHERE DepartmentId = 789

, используяSSMS, ADO, ADO.NET Я либо получаю тайм-аут, либо он занимает слишком много времени (более 10 минут).

Я попытался обновить строки одну за другой с помощью ADO.NET и обнаружил это странное поведение:когда я добираюсь до определенных строк, обновление начинает зависать.Я пробовал перезапускать, удалять и создавать, создавать резервные копии и восстанавливать, удаляя строки и вставляя их заново, но пока не решил.

Заранее спасибо за любые ответы.Hen

Ответы [ 5 ]

2 голосов
/ 11 декабря 2011

Почти все случаи чрезмерной блокировки могут быть исправлены (или, по крайней мере, управляемы) с помощью соответствующих индексов.

Кроме того, вы должны убедиться, что ваши индексы перестроены и ваша статистика обновлена ​​(как минимум).

Определен ли ваш кластерный индекс по составному первичному ключу (PersonId, DepartmentId)?

Существует несколько способов определить, какой процесс блокируется.Одним из которых является sp_who2.Найдите запись в столбце BlkBy.

См. Также: Как найти заблокированные имена таблиц (специфичные для любой транзакции)

2 голосов
/ 11 декабря 2011

Если индексы были добавлены (конечно, вручную, они не добавляются автоматически с помощью FK), то другой основной причиной является запуск триггеров.

Проверка триггеров на задействованных таблицах.

1 голос
/ 17 апреля 2012

Это было давно, но вот выявленная проблема: на одну из зависимостей (через зависимость FK) ссылается представление, которое привязано к схеме.Представление должно оставаться привязанным к схеме, поскольку оно индексируется по полному тексту.

Решение - это удаление и воссоздание представления и индекса fts.(Любые другие идеи будут оценены)

0 голосов
/ 11 декабря 2011

Запустите sp_who2 и посмотрите, какие блоки появляются, если таковые имеются.Если таковых нет, рассмотрите, как предложил гдн, посмотрите, есть ли у вас какие-либо триггеры, которые могут вызывать чрезмерное количество времени для запуска.

0 голосов
/ 11 декабря 2011

Попробуйте выполнить тот же запрос с помощью инструментов управления SQL Server сразу после перезапуска сервера базы данных. Если он там работает нормально, возможно, у вас проблемы с блокировкой.

Попробуйте также создать индекс для DepartmentId.

EDIT: Если проблема с производительностью, рассмотрите возможность создания индекса на Permissions PersonId в дополнение к индексу Persons DepartmentId.

...