Como leio o custo de consulta e é sempre uma porcentagem?

34

Atualmente, estou estudando para o SQL 70-433 (o exame de certificação da Microsoft) e estou ficando muito confuso sobre a métrica de desempenho "custo de consulta".

De acordo com qualquer documentação que eu pudesse encontrar via Google, o custo da consulta é um valor percentual e representa a porcentagem de todo o lote ocupado por qualquer parte dele. Isso já me pareceu um pouco estranho, pois estou interessado no mérito absoluto de uma consulta específica, e não no mérito relativo a outras consultas que aparecem ao lado.

Mas então pensei: talvez o que você deva fazer seja colocar duas consultas alternativas lado a lado, executá-las como "um lote" e, em seguida, a que tiver um custo menor que 50% será a vencedora.

Mas a discussão sobre o custo da consulta no capítulo 6, lição um do SQL 70-433 Training Kit da Microsoft não parece ter relação alguma com isso.

Aqui está um exemplo: Eles mostram uma consulta contendo duas subconsultas correlacionadas e, em seguida, aprimoram-na substituindo as subconsultas por uma APLICAÇÃO EXTERNA. O resultado: "Esta consulta tem um custo de aproximadamente 76, enquanto o custo da primeira consulta foi o dobro, cerca de 151". Eles melhoram ainda mais a consulta e reduzem o custo de 76 para 3,6. Eles não implicam que esses números sejam porcentagens, enquanto que eles são absolutos que se relacionam à consulta como um objeto independente, sem referência a outras consultas. De qualquer forma, como a primeira consulta poderia ter um custo de 151%?

Mais adiante neste capítulo, eles mostram uma captura de tela de um plano de execução com três partes. O primeiro diz "Custo: 0%", o segundo diz "Custo: 1%" e o último diz "Custo: 99%", mas o texto (do livro em si) abaixo da captura de tela "O custo desta consulta é 0,56" . Suponho que eles significam algum outro tipo de custo, mas não consigo encontrar referência a ele em nenhum outro lugar.

Alguém pode ajudar? Estou completamente confuso.


fonte
PS Presumindo que eles estejam se referindo a algo diferente das porcentagens mostradas nos planos de execução ... como faço para que o SSMS me mostre os números que estão citando? Preciso de algo como SET STATISTICS TIME ON, mas com algum outro comando que me mostre um valor de "custo" na guia Mensagens?

Respostas:

43

O custo da consulta é relatado nos planos de execução como "custo estimado da subárvore". Esta é uma figura absoluta como 1.5. Conor Cunningham mencionou em uma apresentação do SQLBits que originalmente se referia ao número de segundos necessários para executar em uma máquina específica de um funcionário da Microsoft ( "Nick's Machine" ) nos 7 dias do SQL Server

insira a descrição da imagem aqui

mas agora deve ser interpretado como uma medida sem custo do custo total.

O plano de execução é uma árvore. Cada iterador na árvore recebe um custo estimado da CPU e um custo estimado de IO, e estes são adicionados para obter o custo geral (as ponderações relativas podem ser ajustadas com alguns comandos DBCC não documentados ). O custo estimado da subárvore inclui o custo do próprio iterador e de todos os seus descendentes. Para ver um exemplo das fórmulas de cálculo de custos usadas, consulte este artigo .

Para determinar o custo estimado de uma consulta inteira no SSMS, selecione o iterador raiz (por exemplo, o SELECTiterador) à esquerda do plano gráfico e observe essa métrica na janela de propriedades do SSMS.

Ao executar várias consultas (no mesmo lote ou não), a porcentagem é calculada somando todos esses valores e calculando a porcentagem conforme o esperado.

Você deve estar ciente de que, mesmo nos planos de execução reais, esse valor de custo é baseado em estimativas, e usá-lo para comparar os méritos relativos de duas consultas diferentes pode ser lamentavelmente errado nos casos em que as estimativas são imprecisas.

Martin Smith
fonte
Obrigado, isso é realmente útil. E nada óbvio! Eu me pergunto por que esse número não é sinalizado com mais clareza?
4
Eu sempre me perguntei sobre a unidade de medida, feliz em finalmente descobrir. Eu tenho explicado às pessoas (comicamente) que são "Dólares SQL". Se o custo de uma consulta for 1,0, é como pagar 1 dólar por uma xícara de café. Não é um preço ruim. Você pagaria US $ 300 por uma xícara? De jeito nenhum!
datagod