Немного контекста.
Сначала мы писали отчеты «прямо вверх», без каких-либо подсказок по блокировке в запросах. При больших отчетах это иногда вызывает проблемы с блокировкой. В первом мы исправить это с помощью WITH (NOLOCK)
подсказки для таблиц в запросе.
Потому что (а) это довольно навязчивое, и (б) легко забыть намек на один из столов, мы перешли к настройкам второго подхода TRANSACTION ISOLATION LEVEL
к READ UNCOMMITTED
(это хорошо) в верхней части запроса каждого набора данных.
Как вы можете догадаться, все еще легко забыть подсказку для одного из наборов данных. Так что это приводит к вопросу:
Вопрос: Какие есть варианты отправки NOLOCK
подсказок вместе с запросами к отчету?
PS. Я понимаю, что это в некоторой степени проблема XY (со многими другими моими опциями для X, такими как оптимизация запроса, не ведение отчетов в оперативной базе данных и т. Д.), Но, тем не менее, попытался сделать этот вопрос правильным для себя. ,
Опции:
Вот опции, упомянутые выше, с добавленными опциями, о которых мне интересно, будут ли они работать:
- Установить
WITH (NOLOCK)
подсказку для каждой таблицы. (навязчиво, очень легко забыть) - Установите уровень изоляции
READ UNCOMMITTED
для всего запроса. (все еще легко забыть) - Можно ли указать это на уровне отчета ? Например, убедитесь, что все запросы к набору данных для одного отчета будут выполняться без блокировки.
- Можно ли указать это на каком-то другом уровне SSRS ? Например, возможно установить это для определенной папки отчетов или с помощью расширения?
- Можно ли указать это на уровне источника данных / строки подключения ? Например, все ли соответствующие отчеты используют определенный «источник данных без блокировки»?
- Относительно предыдущего варианта: возможно, можно указать подсказку по умолчанию для конкретного «no-lock-sql-user» (который используется в соединении)?
- ???
Какие варианты являются жизнеспособными? Есть ли варианты, которые я пропустил?
источник
Ответы:
Быстрые ответы:
Есть несколько вариантов, которые являются жизнеспособными, если отчеты оптимизированы и все еще вызывают проблемы:
источник
Рассматривали ли вы
READ_COMMITTED_SNAPSHOT
версионирование строк для базы данных?У Ким Трипп есть хорошая статья об этом на http://msdn.microsoft.com/en-us/library/ms345124%28v=sql.90%29.aspx
READ_COMMITTED_SNAPSHOT
обеспечивает лучшую функциональность, чемWITH (NOLOCK)
в том смысле, что обеспечивает абсолютную согласованность по времени для длительных агрегатов или запросов с повышенной пропускной способностью из-за уменьшения конкуренции за блокировку.источник