Проблема параллелизма SQL Server - PullRequest
0 голосов
/ 01 июля 2011

У меня есть отчет, который находится в верхней части представления.Представление базовых таблиц обновляется каждые 15 минут, и цикл обновления занимает приблизительно 1-2 минуты, и в течение этого времени, если я запускаю свой отчет, в моем отчете появляются неправильные значения. Есть способ, которым я могу применить какие-то блокировкичтобы я мог получить отчет после завершения обновления и избежать грязных данных в моем отчете. Пожалуйста, дайте мне знать, если есть какие-либо другие решения для этой проблемы

Спасибо, Рави

Ответы [ 3 ]

1 голос
/ 01 июля 2011

Я хотел бы рассмотреть возможность использования другого метода для обновления базовых таблиц. Вместо того, чтобы обновлять эти таблицы в течение 1-2 минут, создайте «теневые» таблицы в другой схеме. (И есть третья схема для временного хранения.) Это позволяет вам работать с таблицами, которые пользователи не видят, а затем переключать их, используя просто операцию метаданных. Тогда вы можете сделать это:

  1. усечение / повторное заполнение теневых таблиц (2 минуты, а может и меньше, без конфликтов)
  2. начать транзакцию (менее миллисекунды)
  3. переместить первичную таблицу в схему хранения, используя команду ALTER SCHEMA ... TRANSFER (в миллисекундах)
  4. переместить таблицу теней в схему dbo (с точностью до миллисекунды)
  5. перемещение первичной таблицы в теневую схему (с точностью до миллисекунды)
  6. зафиксировать транзакцию (с точностью до миллисекунды)
  7. (необязательно) усекать теневую таблицу, чтобы восстановить некоторое пространство (в секунду)

Одним из недостатков этого решения является то, что у вас будет два набора статистики, индексов и т. Д. Для поддержки. С статистикой у вас должно быть все в порядке, если данные просто увеличиваются и не меняются существенно.

У Адама Хейнса очень подробное описание этого метода (которое я показал ему несколько лет назад) здесь:

http://jahaines.blogspot.com/2009/10/locking-table-while-it-is-being-loaded.html

1 голос
/ 01 июля 2011

Аналогично ответу Аарона Бертранда, но с использованием синонимов:

В этом случае у вас есть 2 синонима: один для «таблица для загрузки» и один для «таблица для запроса»

Различные операторы CREATE могут быть заключены в хранимую процедуру, которая имеет EXECUTE AS OWNER для повышения разрешений.

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

0 голосов
/ 01 июля 2011

Рассматривали ли вы получение данных отчета в повторяющихся режимах чтения или изоляции сериализации?

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