Algum contexto:
no início, escrevemos relatórios apenas "diretamente", sem nenhuma dica de bloqueio nas consultas. Com os relatórios maiores, isso às vezes causava problemas de bloqueio. No primeiro nós remediado isso usando a WITH (NOLOCK)
dica para tabelas na consulta.
Como (a) é bastante invasivo e (b) é fácil esquecer a dica para uma das tabelas, passamos para uma segunda configuração de abordagem TRANSACTION ISOLATION LEVEL
para 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. Portanto, isso leva à pergunta:
Pergunta: Quais são as opções para enviar NOLOCK
dicas junto com consultas de relatório?
PS. Sei que isso é, de certa forma, um problema XY (com muitas das minhas outras opções para X, como otimizar a consulta, não gerar relatórios no banco de dados operacional, etc.), mas tentei fazer disso uma pergunta válida em si mesma. .
Opções:
Aqui estão as opções mencionadas acima, com opções adicionais sobre as quais tenho curiosidade de saber se elas funcionariam:
- Definir
WITH (NOLOCK)
dica para cada tabela. (intrusivo, muito fácil de esquecer) - Defina o nível de isolamento
READ UNCOMMITTED
para a consulta inteira. (ainda fácil de esquecer) - É possível especificar isso no nível do relatório ? Por exemplo, verifique se todas as consultas do conjunto de dados de um relatório serão 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 certa "fonte de dados sem bloqueio"?
- Relacionado à opção anterior: talvez seja possível especificar uma dica de bloqueio padrão para um "usuário no-lock-sql-user" específico (aquele que é usado na conexão)?
- ???
Quais opções são viáveis? Há opções que eu perdi?
fonte
Respostas:
Respostas rápidas:
Existem algumas opções viáveis se os relatórios forem otimizados e ainda estiverem causando problemas:
fonte
Você considerou o
READ_COMMITTED_SNAPSHOT
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 do queWITH (NOLOCK)
na medida em que fornece consistência point-in-time absoluta para agregações ou consultas de longa execução com maior taxa de transferência devido à contenção de bloqueio reduzida.fonte