Fundamentos gratuitos da semana de ajuste de consulta: Parte 5, Anti-padrões comuns do T-SQL

Fundamentos gratuitos da semana de ajuste de consulta: Parte 5, Anti-padrões comuns do T-SQL

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


/ *

Fundamentos do ajuste de consulta: anti-padrões comuns do T-SQL

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

CONJUNTO ESTATISTICAS IO, TEMPO EM;

IR

/ * Crie alguns índices para apoiar nossas consultas: * /

CRIO ÍNDICE IX_Localização EM dbo.Comercial(Localização);

CRIO ÍNDICE IX_UserId EM dbo.Comentários(ID do usuário);

CRIO ÍNDICE IX_CreationDate EM dbo.Comentários(Data de criação);

IR

/ * Variáveis ​​de tabela * /

DECLARAR @Comercial MESA (Eu iria INT);

INSERIR PARA DENTRO @Comercial (Eu iria)

SELECT Eu iria

A PARTIR DE dbo.Comercial;

SELECT CONTAGEM(*) A PARTIR DE @Comercial;

IR

/ * Funções com valor de tabela com várias instruções * /

CRIO OU ALTERAR FUNÇÃO dbo.fn_GetUsers ( @Localização NVARCHAR(200) )

DEVOLUÇÃO @Fora MESA ( ID do usuário INT )

COM ESQUEMA

COMO

INÍCIO

INSERIR PARA DENTRO @Fora(ID do usuário)

SELECT Eu iria

A PARTIR DE dbo.Comercial

ONDE Localização = @Localização;

RETORNA;

FIM;

IR

SELECT * A PARTIR DE dbo.fn_GetUsers( ‘Índia’ );

IR

SELECT c.*

A PARTIR DE dbo.fn_GetUsers ( ‘Índia’ ) você

INTERIOR JUNTE-SE dbo.Comentários c EM você.ID do usuário = c.ID do usuário

ORDEM POR c.Data de criação;

IR

Leia Também  Seja um aliado e um incômodo - SQLBlog.org

/ * Funções na cláusula WHERE – às vezes: * /

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = ‘Helsinki, Finlândia’;

IR

SELECT *

A PARTIR DE dbo.Comercial

ONDE LTRIM(RTRIM(Localização)) = ‘Helsinki, Finlândia’;

IR

SELECT *

A PARTIR DE dbo.Comercial

ONDE SUPERIOR(Localização) = ‘Helsinki, Finlândia’;

IR

SELECT *

A PARTIR DE dbo.Comercial

ONDE UpVotes + DownVotes > 1000000;

IR

/ * Podemos corrigir isso com índices? * /

/ * Às vezes, as funções da cláusula WHERE são válidas: * /

SELECT *

A PARTIR DE dbo.Comentários

ONDE FUNDIDA(Data de criação COMO ENCONTRO) = ‘2009-11-10’;

IR

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = LTRIM(RTRIM(‘Helsinki, Finlândia’));

IR

/ *

Conversões implícitas: quando o SQL Server precisa comparar duas coisas, mas o

tipos de dados não são os mesmos. Às vezes, o SQL Server pode convertê-los automaticamente:

* /

DECLARAR @Localização XML = ‘Helsinki, Finlândia’;

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

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @Localização;

IR

/ * Ou tente o seguinte: * /

DECLARAR @Localização VARCHAR(100) = ‘Helsinki, Finlândia’;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @Localização;

IR

/ * Nota – nenhum aviso no plano.

Ou isso – observe que estou passando uma string, não uma data:

* /

DECLARAR @NotADate NVARCHAR(100) = ‘2009-11-10’;

SELECT *

A PARTIR DE dbo.Comentários

ONDE Data de criação = @NotADate;

IR

/ *

Mas se você passar um tipo de dados de alta fidelidade do que o armazenado na tabela:

* /

DECLARAR @NotADate SQL_VARIANT = ‘2009-11-10’;

SELECT *

A PARTIR DE dbo.Comentários

ONDE Data de criação = @NotADate;

IR

/ *

Coisas para pensar:

* O SQL Server converte o conteúdo da tabela para corresponder ao tipo de dados recebidos

* O uso da CPU aumenta linearmente com o número de linhas / colunas a serem convertidas

* Temos uma varredura, não uma busca

* As estimativas também costumam ser muito diferentes

Leia Também  Transformações de pesquisa difusa no SSIS

Concedido, você provavelmente nunca verá pessoas usando SQL_VARIANT (e agora você sabe o porquê.)

Mas aposto que você vê tabelas com VARCHAR nelas, então vamos configurar uma:

* /

CRIO MESA dbo.Users_Varchar (Eu iria INT PRIMARY CHAVE CLUSTERED, Nome em Exibição VARCHAR(40.));

INSERIR PARA DENTRO dbo.Users_Varchar (Eu iria, Nome em Exibição)

SELECT Eu iria, Nome em Exibição

A PARTIR DE dbo.Comercial;

IR

CRIO ÍNDICE IX_DisplayName EM dbo.Users_Varchar(Nome em Exibição);

IR

/ * Nossa consulta usará o índice se passarmos uma variável NVARCHAR? * /

DECLARAR @DisplayNameNvarchar NVARCHAR(40.) = «Brent Ozar»;

SELECT *

A PARTIR DE dbo.Users_Varchar

ONDE Nome em Exibição = @DisplayNameNvarchar;

IR

/ * Isso pode afetar bastante as junções, portanto, verifique os campos nos quais você participa: * /

COM ProblematicColumns COMO (

SELECT NOME DA COLUNA

A PARTIR DE INFORMATION_SCHEMA.COLUNAS c1

GRUPO POR NOME DA COLUNA

TENDO CONTAGEM(DISTINCT TIPO DE DADOS) > 1

)

SELECT c.*

A PARTIR DE ProblematicColumns pc

INTERIOR JUNTE-SE INFORMATION_SCHEMA.COLUNAS c EM pc.NOME DA COLUNA = c.NOME DA COLUNA

ORDEM POR c.NOME DA COLUNA, c.TIPO DE DADOS;

IR

/ * Comparando o conteúdo de duas colunas na mesma tabela: * /

SELECT você.Nome em Exibição, você.Eu iria, CONTAGEM(*) COMO NumberOfComments

A PARTIR DE dbo.Comercial você

INTERIOR JUNTE-SE dbo.Comentários c EM você.Eu iria = c.ID do usuário

ONDE você.DownVotes + você.UpVotes > 1000000

GRUPO POR você.Nome em Exibição, você.Eu iria;

IR

/ *

Coisas para pensar:

* Como são as estimativas versus as reais?

* Qual é o efeito?

* Você pode corrigir a estimativa inserindo índices?

* Você pode imaginar um cenário em que essa consulta seja executada muito, muito lentamente?

* Como você pode refazer esta consulta, para corrigir a estimativa, E / OU reduzir

o raio de explosão dessa estimativa ruim?

* /

Leia Também  Test-driven database hotfix development (TDHD) with SQL unit test based framework (tSQLt)

/ *

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