Atualizar estatísticas com verificação completa no SQL Server 2014 usa 100% da CPU, em 2008 R2, 15%

10

Por que as estatísticas de atualização de verificação completa usam 100% da CPU no SQL Server 2014 quando usam talvez 20% da CPU no SQL Server 2008 R2, para as mesmas tabelas, com capacidade de hardware semelhante?

Eu estive olhando MAXDOP, outras opções, e realmente não vejo nada que se destaque. Percebo que pode haver configurações que possam causar isso, mas as configurações são muito semelhantes para os dois bancos de dados (por exemplo, MAXDOPé 4 para ambos, com os dois tendo vários núcleos). Ambos são Enterprise Edition.

Existe algo "diferente" no SQL Server 2014 versus o SQL Server 2008 R2 que possa explicar isso? Eu tenho a opção de memória em 90% para os dois servidores. Alguma idéia sobre o que procurar?

Executo estatísticas de atualização com verificação completa (100%) uma vez por semana em dois servidores usando o SQL Server 2008 R2 / SP3 e o SQL Server 2014 / SP2, e os bancos de dados têm a mesma estrutura. No servidor 2008 R2, as estatísticas de atualização de duas tabelas muito grandes levam várias horas, o que eu espero, mas a CPU permanece com menos de 20% de utilização o tempo todo. No servidor de 2014, no entanto, a CPU chega a 100% por cerca de 40 minutos. As tabelas são um pouco menores no servidor de 2014. Eu vejo isso usando os menus de análise do SQL Monitor.

Aqui está a saída do arquivo de log Ola no SQL Server 2014, a CPU vai para 100% de cerca de 2:10 para 2:45:

Date and time: 2017-06-24 02:10:20  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:07:48  
Date and time: 2017-06-24 02:18:08  
Date and time: 2017-06-24 02:18:08  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000006_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:32:22  
Date and time: 2017-06-24 02:50:30  

Aqui está a saída do arquivo de log Ola no SQL Server 2008 R2 para as duas estatísticas acima, mas a CPU chega a talvez 15%:

Date and time: 2017-06-24 03:30:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000003_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:05:00  
Date and time: 2017-06-24 03:35:32  
Date and time: 2017-06-24 03:35:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000004_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:52:31  
Date and time: 2017-06-24 04:28:03

Não posso executá-los com o servidor maxdop = 1, pois isso elimina toda a geração de plano paralelo e isso pode prejudicar o aplicativo. Eu pretendo ir na direção oposta e aumentá-lo para 8 (existem 16 núcleos na caixa) e ver o que acontece. Pode ser mais rápido para reduzir o tempo em que a CPU está vinculada. Este trabalho é executado enquanto os usuários estão ausentes.

TRH_SETRANS
fonte
Você verificou se o processo está vinculado a E / S no servidor 2008 R2? A tempdbconfiguração é a mesma? Ele pode ser usado enquanto UPDATE STATISTICSestiver em execução, o que também pode ser um problema.
MicSim 02/08/19
11
Eu também suspeitaria que o paralelismo é provavelmente o culpado. Você verificou o limiar de custo para paralelismo por acaso? Além disso, pode ser uma boa ideia obter a lista completa sp_configure das duas caixas e diferenciá-las para ver o que mais há de diferente.
precisa saber é o seguinte

Respostas:

1

As atualizações de estatísticas podem ficar paralelas com base em várias opções diferentes no SQL Server:

  • Limiar de custo para paralelismo - uma consulta deve ser tão alta para pegar o trem de paralelismo. Seus dois servidores podem ter configurações diferentes de CTFP que fazem com que a atualização 2008R2 seja de thread único, enquanto a de 2014 pode ser de multi-thread.
  • Grau máximo de paralelismo - determina quantos núcleos uma consulta pode usar, no máximo, se o SQL Server decidir paralelizar até esse ponto. A caixa 2008R2 pode ter MAXDOP definido como 1, enquanto a caixa 2014 pode ter o padrão de 0 (ilimitado).
  • Administrador de recursos - esse recurso Enterprise Edition permite limitar diferentes grupos de usuários ou aplicativos para diferentes MAXDOPs.

Nas versões posteriores do SQL Server (2016 e mais recentes), isso fica ainda mais complicado:

  • Opções de escopo no nível do banco de dados - você pode clicar com o botão direito do mouse em um banco de dados, acessar propriedades e definir o nível MAXDOP para esse banco de dados.
  • Dicas de paralelismo de estatísticas - a partir de 2016 SP2, as instruções de criação e atualização de estatísticas aceitam dicas de MAXDOP

Como você notou, o seu 2008R2 será de rosca única, enquanto o de 2014 será de rosca múltipla (terminando mais rápido, mas aumentando a CPU durante a execução).

Para encontrar o equilíbrio certo para seus trabalhos de estatísticas, pense em:

  • Quais outras cargas de trabalho estão acontecendo no banco de dados ao mesmo tempo? Você pode se dar ao luxo de dominar a caixa durante breves períodos? Por exemplo, em data warehouses que ficam ociosos durante a maioria das horas do fim de semana, eu vi as pessoas analisando as atualizações de estatísticas com fullscans quando sabem que ninguém está usando o servidor de qualquer maneira. Em ambientes transacionais pesados, é necessário começar a usar menos impacto nas tarefas de manutenção se os usuários reclamarem mesmo durante a meia-noite.
  • O fullscan é realmente necessário? Você está vendo consultas que só obtêm bons planos quando você usa a opção fullscan, ou está apenas fazendo isso como uma prática recomendada? À medida que seu banco de dados cresce, se seus investimentos em hardware não acompanharem o ritmo, talvez seja necessário começar a fazer trocas na amostragem de estatísticas, em vez de fazer varreduras completas.
  • Você pode atualizar as estatísticas com menos frequência? Por exemplo, atualize 1/4 das suas estatísticas todo fim de semana e, a cada mês, tudo receberá atualizações das estatísticas?
  • Você pode atualizar menos objetos? Frequentemente, vejo pessoas atualizando estatísticas, mesmo em grandes tabelas de auditoria ou arquivamento, simplesmente porque algumas dezenas de novas inserções foram feitas, mas essas inserções não afetam realmente as estatísticas na tabela (e ninguém as consulta de qualquer maneira).
Brent Ozar
fonte
0

Resposta do wiki da comunidade :

Melhor palpite: O plano escolhido para atualizar as estatísticas é paralelo ou mais paralelo na caixa 2014 do que na caixa 2008 R2.

As estatísticas de atualização paralela estão em vigor fullscandesde 2005 e, para estatísticas de amostra a partir de 2016, consulte Adições do Otimizador de Consulta no SQL Server 2016 por Gjorgji Gjeorgjievski no Blog do Mecanismo de Banco de Dados do SQL Server.

Se você possui o Enterprise Edition, pode usar o Resource Governor para limitar a CPU que está sendo usada pelo seu trabalho de manutenção.

Considere também votar na sugestão de conexão Adicionar MAXDOPparâmetro às estatísticas de atualização por Javier Villegas.

Perguntas e respostas relacionadas: Atualização de estatísticas paralelas

user126897
fonte