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.
Respostas:
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.
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 ....
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.
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
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.
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