Planos do SQL Server: diferença entre Index Scan / Index Seek

87

Em um plano de execução do SQL Server, qual é a diferença entre uma varredura de índice e uma busca de índice

Estou no SQL Server 2005.

cindi
fonte

Respostas:

128

Uma varredura de índice é onde o servidor SQL lê todo o índice em busca de correspondências - o tempo que isso leva é proporcional ao tamanho do índice.

Uma busca de índice é onde o servidor SQL usa a estrutura b-tree do índice para buscar diretamente os registros correspondentes (veja http://mattfleming.com/node/192 para uma ideia de como isso funciona) - o tempo gasto é apenas proporcional a o número de registros correspondentes.

  • Em geral, uma busca de índice é preferível a uma varredura de índice (quando o número de registros correspondentes é proporcionalmente muito menor do que o número total de registros), pois o tempo necessário para realizar uma busca de índice é constante, independentemente do número total de registros em seu tabela.
  • Observe, entretanto, que em certas situações, uma varredura de índice pode ser mais rápida do que uma busca de índice (às vezes significativamente mais rápida) - geralmente quando a tabela é muito pequena ou quando uma grande porcentagem dos registros corresponde ao predicado.
Justin
fonte
3
O link ainda está ativo? para mim não funciona. Por favor, ajude se houver um link atualizado
Ronak Agrawal
2
@RonakAgrawal Parece que o link está morto - talvez verifique a wikipedia ?
Justin
5
@RonakAgrawal web.archive.org/web/20141003135304/http://…
rebornx 01 de
76

A regra básica a seguir é Scans are bad, Seeks are good.

Index Scan

Quando o SQL Server faz uma varredura, ele carrega o objeto que deseja ler do disco na memória e, em seguida, lê esse objeto de cima para baixo, procurando os registros de que precisa.

Busca de índice

Quando o SQL Server faz uma busca, ele sabe onde os dados estarão no índice, então carrega o índice do disco, vai diretamente para a parte do índice de que precisa e lê para onde os dados de que precisa terminam . Esta é obviamente uma operação muito mais eficiente do que uma varredura, pois o SQL já sabe onde os dados que está procurando estão localizados.


Como posso modificar um plano de execução para usar uma busca em vez de uma varredura?

Quando o SQL Server está procurando por seus dados, provavelmente uma das maiores coisas que farão o SQL Server mudar de uma busca para uma varredura é quando algumas das colunas que você está procurando não estão incluídas no índice que você deseja que ele use. Na maioria das vezes, isso fará com que o SQL Server volte a fazer uma verificação de índice clusterizado, uma vez que o índice clusterizado contém todas as colunas da tabela. Este é um dos maiores motivos (pelo menos na minha opinião) que agora temos a capacidade de INCLUIR colunas em um índice, sem adicionar essas colunas às colunas indexadas do índice. Ao incluir as colunas adicionais no índice, aumentamos o tamanho do índice, mas permitimos que o SQL Server leia o índice, sem ter que voltar para o índice clusterizado ou para a própria tabela para obter esses valores.

Referências

Para obter informações sobre as especificações de cada um desses operadores em um plano de execução do SQL Server, consulte ....

John Sansom
fonte
7

Resposta curta:

  • Pesquisa de índice: toque em todas as linhas, exceto em algumas colunas.

  • Busca de índice: toque em certas linhas e em certas colunas.

Olhos grandes
fonte
4

Com uma varredura de índice, todas as linhas do índice estão sendo verificadas para encontrar uma linha correspondente. Isso pode ser eficiente para tabelas pequenas. Com uma busca de índice, ele só precisa tocar nas linhas que realmente atendem aos critérios e, portanto, geralmente tem melhor desempenho

AdaTheDev
fonte
2

Uma varredura de índice ocorre quando a definição de índice não pode ser encontrada em uma única linha para satisfazer os predicados de pesquisa. Nesse caso, o SQL Server precisa examinar várias páginas para encontrar um intervalo de linhas que satisfaça os predicados de pesquisa.

No caso de uma Busca de Índice, o SQL Server encontra uma única linha que corresponde aos predicados de pesquisa usando a definição de índice .

Index Seeks são melhores e mais eficazes.

kevchadders
fonte
0

Uma varredura toca todas as linhas da tabela mesmo que seja o que você procura ou não

Uma busca olha apenas para as linhas que você está procurando.

As buscas são sempre melhores do que as varreduras, pois são mais eficientes na maneira como procuram os dados.

Uma boa explicação pode ser encontrada aqui

AutomatedTester
fonte
3
As buscas nem sempre são melhores, por exemplo, se a tabela for relativamente pequena e uma grande porcentagem das linhas dessa tabela precisar ser retornada, uma varredura de índice pode acabar sendo muito mais eficiente.
Justin
1
Olá, Justin, acho que você quer dizer que as varreduras de mesa às vezes podem ser melhores. Indexes Seek são sempre melhores do que Index Scan, a menos que estejamos falando sobre cluster. Mas, às vezes, uma varredura de tabela ou uma varredura de índice agrupado pode ser mais eficiente pelo motivo que você mencionou. Em vez de buscar o índice e obter os campos que não estão no índice da tabela, às vezes, ms sql usará a tabela mesmo se o índice tiver o campo de critérios.
Jose Areas