Será que o meu índice ser usado se todas as colunas não são utilizados?
-
02-07-2019 - |
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?
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.
em bancos de dados Oracle isso é chamado de Composite Index (docs 12g, mas válido para versões anteriores)
Índices compostos podem acelerar a recuperação de dados para instruções SELECT em que as quais as referências cláusula de toda a porção de ataque das colunas no índice composto. Portanto, a fim das colunas usado na definição é importante. Em geral, as colunas mais comumente acessadas ir primeiro.
Assim, no seu caso, sim. o índice seria / poderia ser utilizado. isso pode ser verificado por meio de um plano de explicar.
Se MS SQLSERVER é diferente (e eu suspeito que pode) você vai precisar de uma nova resposta.
Editar: Também deve mencionar isso só vai considerar o índice para uso .. isso não significa necessariamente que ele vai usá-lo.
Edit2: Oracle 11g e posterior agora tem uma opção que lhe permita saltar colunas em um índice. por isso uma consulta em A, B e D ainda pode usar o índice
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 é.
Aqui está outra "depende" resposta ... isso também depende de quão grande é a sua mesa está ...
Eu concordo com todos os outros que mencionou verificando o plano de execução para verificar se ou não seu índice está sendo usado.
Aqui estão um par de artigos sobre a leitura de um plano de execução que você deve achar útil:
http://www.sqlservercentral.com/articles/Administering/executionplans/ 1345 / http://www.codeproject.com/KB/database/ sql-tuning-tutorial-1.aspx
Há também um bom artigo sobre procura vs. scans que eu recomendo: http://blogs.msdn.com/craigfr/archive/ 2006/06/26 / 647852.aspx
Há um registro de bons artigos sobre o blog de Craig Freedman, aqui está um outro que você deve achar útil. Este artigo é sobre alguns dos fatores SQL Server usa para determinar qual índice usar ...
http://blogs.msdn.com/craigfr /archive/2006/07/13/664902.aspx
cuidar! Jeff
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.