Algum contexto:
No início, escrevíamos relatórios apenas "diretos", sem nenhuma dica de bloqueio nas consultas. Com os relatórios maiores, isso às vezes causava problemas de bloqueio. Inicialmente , corrigimos isso usando a WITH (NOLOCK)
dica para tabelas na consulta.
Como (a) é bastante intrusivo e (b) é fácil esquecer a dica para uma das tabelas, passamos para uma segunda configuração TRANSACTION ISOLATION LEVEL
de abordagem READ UNCOMMITTED
(o que é bom) na parte superior da consulta de cada conjunto de dados.
Como você pode imaginar, ainda é fácil esquecer a dica para um dos conjuntos de dados. Então isso leva à pergunta:
Descrição: Quais são as opções para envio de NOLOCK
dicas junto com as consultas do relatório?
PS. Eu percebo que isso é até certo ponto um problema XY (com muitas das minhas outras opções para X, como otimizar a consulta, não fazer relatórios no banco de dados operacional etc.), mas tentei fazer disso uma pergunta válida em si mesmo .
Opções:
Aqui estão as opções mencionadas acima, com opções adicionais sobre as quais estou curioso para saber se funcionariam:
- Definir
WITH (NOLOCK)
dica para cada mesa. (obstrutivo, muito fácil de esquecer) - Defina o nível de isolamento
READ UNCOMMITTED
para toda a consulta. (ainda fácil de esquecer) - É possível especificar isso no nível do relatório ? Por exemplo, certifique-se de que todas as consultas de conjunto de dados para um relatório sejam executadas sem bloqueio.
- É possível especificar isso em algum outro nível do SSRS ? Por exemplo, talvez defina isso para uma determinada pasta de relatório ou utilizando uma extensão?
- É possível especificar isso no nível da fonte de dados/cadeia de conexão ? Por exemplo, todos os relatórios relevantes usam uma determinada "fonte de dados sem bloqueio"?
- Relacionado à opção anterior: talvez seja possível especificar uma dica de bloqueio padrão para um "no-lock-sql-user" específico (aquele que é usado na conexão)?
- ???
Quais opções são viáveis? Existem opções que eu perdi?
Você já considerou
READ_COMMITTED_SNAPSHOT
o controle de versão de linha para o banco de dados?Kim Tripp tem um bom artigo sobre isso em http://msdn.microsoft.com/en-us/library/ms345124%28v=sql.90%29.aspx
READ_COMMITTED_SNAPSHOT
permite uma funcionalidade melhor doWITH (NOLOCK)
que fornece consistência pontual absoluta para agregações ou consultas de execução longa com maior rendimento devido à contenção de bloqueio reduzida.Respostas rápidas:
Existem algumas opções viáveis se os relatórios forem otimizados e ainda estiverem causando problemas: