Semana gratuita de Fundamentos da Consulta de consultas: Parte 4, Melhorando a precisão da estimativa de cardinalidade

Semana gratuita de Fundamentos da Consulta de consultas: Parte 4, Melhorando a precisão da estimativa de cardinalidade


/ *

Fundamentos do ajuste de consulta: aprimorando a precisão da estimativa de cardinalidade

v1.0 – 2019-06-30

https://www.BrentOzar.com/go/queryfund

Esta demonstração requer:

* Qualquer versão suportada do SQL Server

* Qualquer banco de dados Stack Overflow: https://www.BrentOzar.com/go/querystack

Este primeiro RAISERROR é apenas para garantir que você não acerte F5 acidentalmente.

execute o script inteiro. Você não precisa executar isso:

* /

RAISERROR(N‘Opa! Não, nãobasta pressionar F5. Execute essas demos uma de cada vez., 20, 1) COM REGISTRO;

IR

/ * Estou usando o banco de dados Stack médio de 50 GB: * /

USAR StackOverflow2013;

IR

/ * E este procedimento armazenado descarta todos os índices não clusterizados: * /

DropIndexes;

IR

/ * Ative os planos de execução reais: * /

SELECT Localização, CONTAGEM(*)

A PARTIR DE dbo.Comercial

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC

IR

/ *

Coisas para pensar:

* Como foram as estimativas de linha para cada operador?

* Quando eles começaram a dar errado e por quê?

* Que impacto isso teve nos operadores upstream?

Quais são algumas das maneiras pelas quais podemos melhorar a precisão da estimativa?

* Atualizar estatísticas

* Crie um índice

* OPÇÃO RECOMPLETA

* Diferentes níveis de compatibilidade

* Adicione um TOP

* /

/ *

A cardinalidade não se refere apenas à contagem de linhas:

também é sobre o conteúdo da linha.

* /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation_CTE COMO

INÍCIO

COM TopLocation COMO (SELECT TOPO 1 Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC)

SELECT você.*

A PARTIR DE TopLocation

INTERIOR JUNTE-SE dbo.Comercial você EM TopLocation.Localização = você.Localização

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation_CTE

IR

Leia Também  Como atualizar de uma instrução SELECT no SQL Server

/ * Uma subconsulta é diferente? * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation_Subquery COMO

INÍCIO

SELECT *

A PARTIR DE dbo.Comercial você

ONDE Localização = (SELECT TOPO 1 Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC)

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation_Subquery

IR

/ *

E se colocarmos o conteúdo do CTE em uma variável primeiro?

* /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation

IR

/ *

Coisas para pensar:

* Construir um plano e executar um plano são duas fases separadas

* O lote inteiro (proc) é compilado de uma só vez

* Às vezes, precisamos que a compilação aconteça mais tarde

* /

/ * Recompilar no nível da instrução * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição

OPÇÃO (RECOMPILE);

FIM

IR

EXEC usp_UsersInTopLocation

IR

/ * Recompilar no nível do processo * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COM RECOMPILE COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição;

FIM

IR

Leia Também  Introdução aos recursos de desempenho no SQL Server no Linux - Uma Visão do SQLEspresso

EXEC usp_UsersInTopLocation

IR

/ *

Para recapitular, a cardinalidade é sobre:

* Quantas linhas um operador lançará

* O conteúdo dessas linhas também

Comece no operador superior direito em cada plano. Quando as estimativas estão> 10x fora,

precisamos descobrir como podemos obter essa estimativa mais precisa, porque

o resto dos operadores a montante provavelmente está ferrado.

Agora é sua vez. Melhore as estimativas desta consulta:

* /

CRIO OU ALTERAR PROC [[dbo].[[usp_rpt_ControversialPosts] COMO

INÍCIO

/ * Fonte: http://data.stackexchange.com/stackoverflow/query/466/most-controversial-posts-on-the-site * /

conjunto Não conta em

declarar @VoteStats mesa (PostId int, acima int, baixa int);

inserir @VoteStats

selecionar

PostId,

acima = soma(caso quando VoteTypeId = 2 então 1 outro 0 0 fim),

baixa = soma(caso quando VoteTypeId = 3 então 1 outro 0 0 fim)

a partir de Votos

Onde VoteTypeId dentro (2,3)

grupo por PostId;

selecionar topo 500 p.Eu iria Como [[Postar Ligação] , v.acima, v.baixa

a partir de @VoteStats v

Junte-se Postagens p em PostId = p.Eu iria

Onde v.baixa > (v.acima * 0,5) e p.CommunityOwnedDate é nulo e p.FechadoData é nulo

ordem por v.acima desc;

FIM

IR

/ *

Licença: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)

Mais informações: https://creativecommons.org/licenses/by-sa/3.0/

Você é livre para:

* Compartilhar – copie e redistribua o material em qualquer meio ou formato

* Adapte – remixe, transforme e desenvolva o material para qualquer finalidade, inclusive

comercialmente

Sob os seguintes termos:

* Atribuição – você deve dar o crédito apropriado, fornecer um link para a licença,

e indicar se foram feitas alterações.

* ShareAlike – Se você remixar, transformar ou desenvolver o material, deverá

distribua suas contribuições sob a mesma licença que o original.

* /

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br