Percebi que em um servidor que executa o SQL Server 2016 SP1 CU6, às vezes, uma sessão de eventos estendidos mostra uma consulta SELECT causando gravações. Por exemplo:
O plano de execução não mostra nenhuma causa óbvia para as gravações, como uma tabela de hash, spool ou classificação que pode ser derramada no TempDB:
A atribuição de variável a um tipo MAX ou uma atualização automática de estatísticas também pode causar isso, mas também não foi a causa das gravações nesse caso.
De que mais poderiam ser as gravações?
Em alguns casos, o Repositório de Consultas pode fazer com que as gravações ocorram como efeito de uma instrução select e na mesma sessão.
Isso pode ser reproduzido da seguinte forma:
Crie uma sessão de eventos estendidos para monitoramento:
Em seguida execute o seguinte:
Uma transação implícita pode ou não ser necessária para reproduzir isso.
Por padrão, no início da próxima hora, o trabalho de coleta de estatísticas do Repositório de Consultas gravará os dados. Isso parece (às vezes?) ocorrer como parte da primeira consulta do usuário executada durante a hora. A sessão Extended Events mostrará algo semelhante ao seguinte:
O log de transações mostra as gravações que ocorreram:
Inspecionar a página com
DBCC PAGE
mostra que as gravações são parasys.plan_persist_runtime_stats_interval
.Observe que as entradas de log mostram três transações aninhadas, mas apenas dois registros de confirmação. Em uma situação semelhante na produção, isso levou a uma biblioteca cliente possivelmente defeituosa que usava transações implícitas iniciando inesperadamente uma transação de gravação, impedindo a limpeza do log de transações. A biblioteca foi escrita para emitir um commit somente após executar uma instrução update, insert ou delete, então ela nunca emitiu um comando commit e deixou uma transação de escrita aberta.
Há outro momento em que isso pode acontecer, e é com uma atualização automática de estatísticas.
Aqui está a sessão XE que veremos:
Em seguida, usaremos isso para coletar informações:
Alguns dos resultados interessantes da Sessão XE:
A atualização automática das estatísticas não mostra nenhuma gravação, mas a consulta mostra uma gravação imediatamente após a atualização das estatísticas.
Desajeitado
Não me lembro se incluí isso na minha resposta original , então aqui está outro casal.
Carretéis!
O SQL Server tem muitos spools diferentes, que são estruturas de dados temporárias armazenadas em tempdb. Dois exemplos são os spools de Tabela e Índice.
Quando ocorrerem em um plano de consulta, as gravações nesses spools serão associadas à consulta.
Estes também serão registrados como gravações em DMVs, profiler, XE, etc.
Carretel de índice
Carretel de mesa
A quantidade de gravações executadas aumentará com o tamanho dos dados em spool, obviamente.
Derramamentos
Quando o SQL Server não obtém memória suficiente para determinados operadores, ele pode derramar algumas páginas no disco. Isso acontece principalmente com classificações e hashes. Você pode ver isso em planos de execução reais e, em versões mais recentes do SQL Server, os spills também são rastreados em dm_exec_query_stats .
Rastreamento
Você pode usar uma sessão XE semelhante à que usei acima para ver isso em suas próprias demonstrações.