Devo criar um índice não clusterizado em todas as colunas pesquisáveis ou apenas em cada coluna separadamente?
On Fevereiro 15, 2021 by adminNão tenho certeza se devo usar índices não agrupados de maneira adequada. O estimador do plano SSMS disse para adicionar outro índice quando o índice a seguir já estivesse na tabela.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
Minha consulta era
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Minha pergunta é … devo criar um índice para todas as chaves de pesquisa possíveis? Eu procuro por mzone, iso e postal em consultas diferentes.
Obrigado
Comentários
- Você está incluindo todas as colunas de a tabela?
- Sim, estou incluindo todas as colunas.
- Incluir todas as colunas em um único índice não vai ajudar muito – esse índice, em primeiro lugar, basicamente dobra os requisitos de espaço, e em segundo lugar, só pode ser usado para as n colunas mais à esquerda – NÃO apenas torna mais rápida a pesquisa pela 17ª coluna em sua tabela.
- E ter índice separado para cada coluna – só porque você pode pesquisá-lo algum dia – também não é muito bom. Um índice tem um custo – em termos de desempenho em cada inserção, atualização, exclusão. Não ' t overindex – isso ' é quase pior do que não ter nenhum índice ….
- Obrigado por esses comentários @marc_s, essa é exatamente a informação que eu estava procurando. Além disso, é apropriado dizer que há um bom intervalo de índices não agrupados para ter (entre 5 e 10, por exemplo) ou é puramente relativo às necessidades da tabela? Em caso afirmativo, a que tipo de coisas é relativo?
Resposta
O SQL Server mostrará um índice gostaria de usar, pois estima que o índice tornaria a vida mais fácil. Certamente, não há necessidade de criar um índice em cada campo pesquisável; na verdade, isso tornará o desempenho de gravação substancialmente pior. Se você tem menos de 5 a 10 índices na tabela fornecida e executa essa consulta o tempo todo, provavelmente deseja adicionar o índice sugerido exatamente como o SSMS mostra.
JNK” s Editar abaixo
Também é importante olhar os índices sugeridos juntos. As sugestões estão todas em silos, por assim dizer, então um índice sugerido inteiro pode ser substituído adicionando um campo INCULDE
d em outro índice.
Por exemplo, é possível ter sugestões para esses dois índices:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Quando na verdade você poderia atender às necessidades de ambos com:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Eu vi isso com índices muito mais complicados (10-20 campos-chave, 10-20 campos incluídos) em que adicionar um campo ao INCLUDE
lista eliminará a necessidade do segundo índice.
Comentários
- @MaxVernon: read Stairway to SQL Server Indexing – Parte 1, Introdução aos índices e o resto dos artigos da série – cobre praticamente tudo sobre índices SQL Server, desde a introdução aos tópicos avançados
- @MaxVernon: ou consulte Índice de cobertura usando colunas incluídas para uma discussão das colunas incluídas para fazer e um índice " cobrindo "
Resposta
O motivo pelo qual está dizendo para você criar um novo índice é porque o que você tem não é o mais ideal possível. O otimizador de consulta é bastante seletivo na forma como escolhe qual índice usar. O link a seguir deve ajudá-lo a entender a seletividade:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Você disse acima que incluiu todas as colunas no índice – essencialmente duplicando os dados da tabela. Com base nisso, qual seria o mal em criar 3 índices separados nas colunas que você mencionou? O espaço utilizado seria menor e a velocidade muito maior. Eu arriscaria supor que isso é o que o plano de DTA / execução está dizendo a você – apenas de uma maneira diferente.
Observe os detalhes do plano de execução que são gerados pela consulta para identificar onde estão seus gargalos e use isso como uma diretriz de como projetar seus índices. O SQL Server é muito bom em saber o que é melhor – confie no que ele está dizendo a você.
Espero que isso ajude você.
Deixe uma resposta