Consultas sargable em sql server com exemplos

longa-sql1

A parte mais interessante do meu trabalho é o ajuste de desempenho e otimização na T-SQL. O coração do ajuste de desempenho em um servidor SQL é a indexação adequada e utilizável em mesas através do uso de consultas sargable.

Às vezes, o banco de dados desenvolvedor sênior no trabalho diz-me apenas para adicionar um índice para uma coluna xyz porque ele está sendo usado em múltiplos Onde cláusulas dentro de várias consultas SQL. Isso é quando eu preciso acalmar minha mente. Se adicionar um índice na coluna xyz poderia resolver todos os problema de desempenho, em seguida, milhares de livros não foram publicados sobre o ajuste do desempenho T-SQL, e eu teria ido caçar para o anaconda na floresta amazônica.

Sargable Consultas (Search Argumentable)



Em termos simples, as consultas sargable são aqueles que são capazes de usar índices criados nelas para pesquisas e execução de uma consulta mais rápidos.
Uma busca rápida significa fazer um índice eficaz procurar um grande número de linhas e evitar varreduras de índice caros.

Index Seek - consultas são capazes de usar os índices de forma eficaz e localizar linhas com menos esforço do otimizador de consulta.
Digitalizar índice - digitalizar toda a tabela para localizar linhas de satisfazer os critérios de pesquisa

O que faz uma consulta não sargable (não é capaz de utilizar índices criados de forma eficaz)?

1. o uso de funções em caso de condições cláusula (porque a função é avaliada contra cada linha que força o otimizador de consulta para não usar o índice)
2. usando LIKE `% Proposta%` em consultas de pesquisa Wild Card
3. realização de cálculo aritmético em uma coluna de índice em uma cláusula WHERE



Vamos criar e preencher uma tabela com 0,1 milhões de linhas para ver como fazer consultas sargable.

Este script levaria tempo para criar os dados da amostra com base em sua configuração de hardware (3-5 minutos).

-- Criar uma tabela com chave primáriaCRIO MESA EmployeeTest (INT id IDENTIDADE(1, 1) PRIMÁRIA CHAVE,Salário INT, DateOfBirth DATETIME, EmployeeName VARCHAR (80)) -IR-- Inserir linhas com valores aleatóriosDECLARAR @linha INT -DECLARAR @string VARCHAR (80), @comprimento INT, @code INTCONJUNTO @linha = 0-ENQUANTO @linha < 100000 INÍCIOCONJUNTO @linha = @linha + 1-IF @linha = 10000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 20000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 30000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 40000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 50000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 60000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 70000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 80000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 90000PRINT `Linhas inseridas:`+CONVERTER (VARCHAR (20), @linha )-E SE @linha = 100000PRINT "Feito, linhas inseridas: `+CONVERTER (VARCHAR (20), @linha ) --- Construir a seqüência aleatóriaCONJUNTO @comprimento = ROUND (80 * RAND (), 0) -CONJUNTO @string = `` -ENQUANTO @comprimento > 0 INÍCIOCONJUNTO @comprimento = @comprimento - 1 -CONJUNTO @code = ROUND (32 * RAND (), 0) - 6 -SE @code ENTRE 1 E 26CONJUNTO @string = @string + CHAR (ASCII (`uma`) + @ Código-1) -OUTROCONJUNTO @string = @string + ``-FIM-- Pronto para o registroCONJUNTO NOCOUNT EM -INSERIR PARA DENTRO EmployeeTest VALORES (ROUND (2000000 * RAND () + 10000,0),CONVERTER(DATETIME, ROUND (60000 * RAND () - 30000, 9)), @ string)FIMIR

» » Consultas sargable em sql server com exemplos