Database
 sql >> Base de Dados >  >> RDS >> Database

Aprimoramentos do plano de apresentação para UDFs


A Microsoft tem aprimorado o conteúdo da saída ShowplanXML para SQL Server nas últimas versões e no SQL Server 2017 CU3, eles introduziram estatísticas de execução de função definida pelo usuário (UDF) no nó QueryTimeStats da saída XML. Isso também foi portado de volta para o SQL Server 2016 no Service Pack 2 para planos de execução reais. Esse recurso permite conhecer definitivamente o impacto da execução de UDF escalar como parte das características de desempenho de uma consulta. No entanto, há um problema interessante associado ao uso desse recurso; você precisa coletar o plano de execução real usando uma versão atualizada do SQL Server Management Studio ou usando o SentryOne Plan Explorer, ou as informações serão removidas do plano de execução.

Comparação de planos em diferentes versões do SSMS


Recentemente, apresentei uma sessão de grupo de usuários em Chicago sobre ajuste de desempenho de consulta usando o cache do plano e durante a sessão eu estava usando a versão mais recente do SQL Server Management Studio na época, versão 17.5. Na época, eu também havia atualizado recentemente minha VM para o SQL Server 2016 Service Pack 2, então demonstrei as novas informações de UdfElapsedTime e UdfCpuTime no plano de exibição real QueryTimeStats e fiz uma anotação para escrever um artigo sobre eles. Quando voltei para realmente iniciar este artigo, usando exatamente a mesma consulta na mesma VM, não consegui gerar um plano de execução real que continha as informações de UdfElapsedTime ou UdfCpuTime apesar das tentativas repetidas. Não consegui descobrir o que estava fazendo de errado e descobri que a raiz do problema foi que eu acidentalmente iniciei o SQL Server Management Studio 2016 em vez do SQL Server Management Studio 17.5. Quando executei a mesma consulta no SSMS 17.5, de repente recebi de volta as informações de UdfElapsedTime e UdfCpuTime. Veja abaixo exemplos do XML retornado de ambas as versões do SSMS:

Showplan XML do SSMS 17.5

Showplan XML do SSMS 2016 – WaitStats e QueryTimeStats foram completamente removidos

Usei o Microsoft Message Analyzer para produzir um rastreamento TCP do tráfego de rede na porta 1433 entre um cliente executando o SSMS 2016 em uma instância do SQL Server 2016 SP2 para capturar os pacotes TDS enviados do servidor para o cliente. Isso revela que o ShowPlanXML retornado pelo servidor incluiu as informações de QueryTimeStats mesmo que não apareça no ShowPlanXML no SSMS 2016, portanto, o cliente está realmente removendo todos os campos não incluídos na definição de esquema fornecida com o cliente.


Deslocamento da mensagem:1635
<.Q.u.e.r.y.T.i.m.e.S.t.a.t.s. .E.l.a.p.s.e.d.T.i.m.e.=.".2.6.7.". .C.p.u.T.i.m.e.=.".2.6.7.". .U.d.f.E.l.a.p.s.e.d.T.i.m.e.=.".2.1.5.". .U.d.f.C.p.u.T.i.m.e.=.".2.1.5.".>.<./.Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>
Isso é algo a ser observado com arquivos .sqlplan que são gerados usando versões de cliente mais antigas do SSMS e/ou planos de execução que são salvos ou copiados de uma versão mais antiga do SSMS, que é algo que geralmente acontece quando estou trabalhando com clientes por o email.

No SSMS, observar o plano de execução gráfica não fornece nenhuma indicação do impacto no desempenho da execução da função escalar definida pelo usuário na consulta:



Se basearmos nossa análise do desempenho estritamente nos custos de cada operador, o Compute Scalar para a execução da função não parece ter um impacto significativo no desempenho. As dicas de ferramentas para os operadores também não materializam as informações ou contêm avisos sobre o impacto da função definida pelo usuário. O único local em que vemos essas informações no SSMS atualmente é no XML do plano, ou na janela Propriedades do operador raiz SELECT do plano, conforme mostrado abaixo:



Usando as informações aqui, porém, podemos ver que o UdfCpuTime é 85,79% do total de CpuTime e o UdfElapsedTime é 64,44% do total ElapsedTime para a execução da consulta (fazendo as contas para calcular as porcentagens usando o QueryTimeStats CpuTime e UdfCpuTime (destacado em azul acima), e o ElapsedTime e UdfElapsedTime).

Usando o SentryOne Plan Explorer para recuperar planos


Uma das minhas ferramentas gratuitas favoritas para ajudar no ajuste de desempenho do SQL Server é o SentryOne Plan Explorer, e um dos recursos do Plan Explorer há muito tempo é a capacidade de gerar um plano de execução real colando o texto do comando em uma nova janela e clicando no botão Obter Plano Real, conforme mostrado abaixo.



Como o Plan Explorer lê o ShowplanXML conforme fornecido pelo mecanismo do SQL Server, ele também conterá as informações aprimoradas no QueryTimeStats. No entanto, se você abrir um plano de execução que foi salvo de uma versão mais antiga do Management Studio ou se usar o Plan Explorer Addin para SSMS em uma versão mais antiga para visualizar o plano no Plan Explorer, as informações aprimoradas não serão mostradas.



A grade de instrução da guia Resultados no Plan Explorer pode ser atualizada usando o Column Chooser para adicionar as colunas UDF Duration e UDF CPU junto com as colunas existentes na grade, facilitando a visualização de onde a execução da função definida pelo usuário está causando impacto para grandes lotes de várias instruções. O Plan Explorer também fornece destaque dessas colunas quando elas são uma parte significativa da CPU geral e/ou duração, conforme mostrado abaixo.



As informações do diagrama de plano no Plan Explorer também foram aprimoradas. Aqui estão os diagramas usando Custos por CPU + E/S e, em seguida, Custos por CPU:

Diagrama de plano usando Custos por CPU + E/S

Diagrama de plano usando Custos por CPU

Há avisos adicionais no operador SELECT raiz quando as estatísticas de execução para funções definidas pelo usuário indicam que elas são uma parte significativa da CPU geral e/ou duração geral:

Dica de ferramenta para a raiz Operador SELECT

O operador Compute Scalar também tem um aviso no Plan Explorer com base na contagem de linhas sendo processada pela operação, mesmo para planos que não incluem os aprimoramentos para o ShowplanXML:

Dica de ferramenta para a computação Operador escalar

Mostrar os custos por CPU pode ajudar a identificar operadores com custos ocultos de CPU que podem ser abafados pela E/S. Essa capacidade de mudar um pouco a visão para solucionar problemas de CPU ou E/S por conta própria é um dos muitos diferenciais entre o Plan Explorer e o SSMS. Aqui está o menu de contexto do diagrama onde você pode alterar essa visualização:


Conclusão


Os aprimoramentos do Showplan XML no SQL Server facilitam muito a determinação do impacto geral das funções escalares definidas pelo usuário no desempenho da consulta no SQL Server 2016 Service Pack 2 e no SQL Server 2017 Cumulative Update 3, desde que você esteja usando um versão recente das ferramentas do cliente ou do Plan Explorer para recuperar o plano de execução.