Atualmente estou estudando para SQL 70-433 (o exame de Certificação Microsoft) e estou ficando muito confuso sobre a métrica de desempenho "custo da consulta".
De acordo com qualquer documentação que encontrei no Google, o custo da consulta é uma porcentagem 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 determinada consulta, em vez de seu mérito em relação a outras consultas que aparecem ao lado dela.
Mas então pensei, bem, talvez o que você deve fazer é colocar duas consultas alternativas lado a lado, executá-las como "um lote" e, em seguida, a que tiver um custo inferior a 50% será a vencedora.
Mas a discussão do custo da consulta no Capítulo 6, lição um do SQL 70-433 Training Kit da Microsoft não parece ter qualquer relação com isso.
Aqui está um exemplo: Eles mostram uma consulta contendo duas subconsultas correlacionadas e, em seguida, melhoram-na substituindo as subconsultas por um OUTER APPLY. 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, mas sim que são números absolutos relacionados à consulta como um objeto autônomo, sem referência a quaisquer outras consultas. E de qualquer forma, como a primeira consulta poderia ter um custo de 151%?
Mais adiante no capítulo, eles mostram uma captura de tela de um plano de execução que tem três partes. O primeiro diz "Custo: 0%", o segundo diz "Custo: 1%" e o último diz "Custo: 99%", mas o texto (do próprio livro) abaixo da captura de tela "O custo desta consulta é 0,56" . Eu estou supondo que eles significam algum outro tipo de custo, mas não consigo encontrar referência a isso em outro lugar.
Alguém pode ajudar? Estou completamente confuso.
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 na máquina de um funcionário da Microsoft em particular ( "Nick's Machine" ) no SQL Server 7 diasmas agora deve ser interpretado como uma medida sem unidade do custo total.
O plano de execução é uma árvore. Cada iterador na árvore recebe um custo estimado de CPU e um custo estimado de E/S e estes são somados para obter o custo geral (os pesos relativos podem ser ajustados com alguns comandos DBCC não documentados ). O custo estimado da subárvore inclui o custo para o próprio iterador e todos os seus descendentes. Para ver um exemplo das fórmulas de custeio usadas, consulte este artigo .
Para determinar o custo estimado de uma consulta inteira no SSMS, selecione o iterador raiz (por exemplo, o
SELECT
iterador) à 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 em 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.