Pergunta

I têm um índice em colunas A, B, C, D da tabela T

I tem uma consulta que puxa a partir de T com A, B, C na cláusula WHERE.

Será o índice de ser utilizado ou venha a um índice separado ser necessário que apenas inclui A, B, C?

Foi útil?

Solução

David B é certo que você deve verificar o plano de execução para verificar o índice está sendo usado.

Será o índice de ser utilizado ou venha a um índice separado ser necessário que apenas inclui A, B, C?

Para responder a esta última parte da pergunta, que eu acho que é o tema central subjacente (em oposição à solução imediata), há quase não uma razão para indexar um subconjunto de colunas indexadas . Se seu índice é (A, B, C, D), um WHERE contra (A, B, C) provavelmente resultará em um índice procurar , que é a situação ideal - o índice inclui toda a informação o motor precisa de ir diretamente para o conjunto de resultados. Eu acredito que este é vale para tipos numéricos e para testes de igualdade em tipos de cordas, embora possa quebrar com LIKE '%' s). Por outro lado, se o seu ONDE única referenciada D, você provavelmente acabar com um índice Varredura , o que significaria que o motor SQL teria para fazer a varredura através de todas as combinações de A, B, e C, e em seguida, verificar se D conheceu seus critérios antes de decidir se deseja adicionar a linha para o conjunto de resultados. Em um particularmente grande mesa, quando me vi tendo que fazer um monte de consultas em coluna "D", eu adicionei um índice adicional para D melhoria de desempenho apenas, e viu cerca de 90%.

Edit: Eu também deve recomendar usando o Database Engine Tuning Advisor no SQL Server Management Studio. Vai dizer-lhe se a sua mesa não é indexado ideal para a consulta que você deseja executar.

Outras dicas

Depende!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

Estes não contará com o índice, porque o índice não é útil.

Clique em "display estimado plano de execução" para confirmar a utilização do índice potencial.

O índice será usado, sim. É bastante inteligente sobre quais índices irá produzir um plano de consulta mais ideal, e não deve ter problemas com isso.

Tal como acontece com esse tipo de coisa, não tome minha palavra para ela - benchmark. Criar uma tabela, preenchê-lo com dados representativos, consulta-lo, indexá-lo, e consulta-lo novamente.

O fato de que o índice contém uma coluna que não é utilizado na sua consulta não vai impedir que ele seja usado.

Isso não quer dizer que ele definitivamente ser usado, ele pode ser ignorado por um motivo diferente (talvez porque um ou mais outros índices são mais úteis).

Como sempre, dê uma squizz no plano de execução estimado para ver o que é provável que aconteça.

Comece com o simples é igual a pesquisa (ONDE A = 1 e B = 'Red' e C = 287) sim o índice (mais provável) ser utilizado. O índice será usado pela primeira vez para ajudar o otimizador de "adivinhar" o número de linhas que combinam com a seleção e, em seguida, em segundo lugar, para realmente acessar essas linhas.

Em resposta ao comentário de David B sobre o "como" predicado, SQLServer ainda pode usar o índice, isso depende do que você está selecionando. Por exemplo, se você está selecionando um count (*), em seguida, SQLServer provavelmente fazer a varredura do índice e contar os hits que correspondem a cláusula where desde que o índice é menor e exigiria menos iOS para digitalizar. E pode decidir fazer isso, mesmo se você está selecionando algumas colunas da tabela de base, dependendo de como SQLServer seletivo sente o índice é.

De um modo geral sim, será, todos os bancos de dados modernos são bastante inteligente para fazer isso. Há exceções, por exemplo, se as estatísticas sobre a tabela mostram que o volume de dados em que é suficientemente pequeno que uma leitura completa da tabela será mais eficiente, em seguida, o índice será descontado, mas como regra geral, você pode contar com ele se for o caso.

Por isso, você pode tirar vantagem deste ao projetar seus índices. Digamos, por exemplo, tenho uma tabela que contém A, B, C como valores de chave e colunas de dados Y e Z contendo, que eu sei que vai ser recuperado frequentemente pelas declarações

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

O I será geralmente criar um índice em A, B, C, X, Z - assumindo que X e Z são alguns razoavelmente pequeno campo. A razão para isso é que eu sei o caminho de acesso nas demonstrações acima irá usar o índice, e como os dados que deseja recuperar já está na leitura do índice Leia então não separada do bloco de dados necessário para recuperar os dados da tabela em si serão necessários. Esta estratégia pode acelerar drasticamente a recuperação de dados em algumas circunstâncias. Claro, você paga por ele nos custos de atualização e espaço em disco que você precisa entender o que seu banco de dados está fazendo antes de aplicá-lo, mas como na maioria dos bancos de dados lê dramaticamente superam as gravações geralmente é bem a pena a consideração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top