Проблема с производительностью просмотра базы данных - PullRequest
1 голос
/ 11 июня 2009

Я использую SQL Server 2008, и у меня есть две таблицы, которые имеют одну и ту же схему, и я создаю представление, которое объединяет содержимое двух таблиц, чтобы обеспечить единое представление "таблица" для внешнего доступа.

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

Мой вопрос: если другая таблица находится в режиме массовой вставки / удаления, будет ли заблокирована физическая таблица, чтобы доступ внешнего пользователя к представлению объединения двух таблиц также был заблокирован? (Я думаю о том, применяется ли в этом сценарии эскалация блокировок, блокировки строк окончательно блокируют таблицу, что в итоге блокирует доступ к представлению?)

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Скорее всего, да. Зависит от повышения блокировки

Чтобы обойти (не все варианты):

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

  • Используйте WITH (READPAST), если вы не против пропустить заблокированные строки в таблице BCP

  • Изменить гранулярность блокировки для таблицы BCP. Используйте sp_tableoption и установите «блокировка таблицы при массовой загрузке» = false.

Редактировать: Теперь я выпил кофе ...

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

Редактировать 2: SNAPSHOT изоляция

2 голосов
/ 11 июня 2009

если другая таблица находится в режиме массовой вставки / удаления, будет ли заблокирована физическая таблица, чтобы доступ внешнего пользователя к представлению объединения двух таблиц также был заблокирован?

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

Если вы хотите оптимизировать время массовой загрузки, прочитайте это сообщение в блоге .

EDIT

Какую реальную проблему вы испытываете? Вам действительно нужно использовать это представление везде (например, есть ли места, где нужны данные только из одной таблицы, которые запрашивают их через представление?)

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

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