AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 64615
Accepted
Greg
Greg
Asked: 2014-05-07 19:24:29 +0800 CST2014-05-07 19:24:29 +0800 CST 2014-05-07 19:24:29 +0800 CST

Alguma vantagem de ter um segundo índice com colunas incluídas em uma chave primária?

  • 772

Estou revisando nosso banco de dados e notei que em uma determinada tabela temos os seguintes índices:

Tabela :

Col1    INT IDENTITY(1,1) Primary Key
Col2    INT
...
about 15 more columns
....
ColN   VARCHAR(50)
....
another 10 more columns

Além do índice clusterizado de chave primária padrão em Col1, também temos o seguinte índice:

create nonclustered index [iTable-Col1] ON [dbo].[Table1]
(
    Col1
)
include ( ColN )

Pesquisamos regularmente Col1e queremos apenas recuperar arquivos ColN. Esse índice é usado porque é o menor índice que contém todos os dados necessários para satisfazer a consulta.

Minha pergunta é, esse índice agrega algum benefício ao SQL Server? Seria melhor abandoná-lo e apenas fazer uma pesquisa no índice clusterizado?

Meu único pensamento é que esse índice é muito menor do que o índice clusterizado (25 MB x 300 MB), o que pode tornar a pesquisa e/ou o armazenamento em cache mais rápido.

O servidor é o SQL Server 2012, se isso fizer alguma diferença.

sql-server sql-server-2012
  • 2 2 respostas
  • 2640 Views

2 respostas

  • Voted
  1. Best Answer
    Jon Seigel
    2014-05-11T08:45:56+08:002014-05-11T08:45:56+08:00

    Na maioria das vezes, esse tipo de índice só é útil para varreduras de índice nessas colunas.

    A estrutura da árvore de índice acima do nível folha geralmente será muito semelhante em termos de níveis de árvore; portanto, se for esse o caso, há pouca ou nenhuma diferença de desempenho na navegação na árvore para operações de busca (que também não verificam). Se você quiser aprender o básico sobre índices internos, tenho um vídeo aqui que irá ajudá-lo.

    De qualquer forma, de volta aos exames. As razões pelas quais esse índice seria útil são muito menos sobre o índice em si e mais sobre por que não varrer o índice clusterizado (ou manter essas páginas de dados na memória). Se as outras colunas tornam a tabela relativamente larga (com base nos tamanhos que você deu, eu diria que sim, embora não esteja claro o tamanho dessa tabela no contexto de todo o banco de dados), o índice estreito pode ser benéfico em alguns casos . Varreduras frequentes (ou buscas em muitos valores de chave diferentes) tenderão a manter todo o índice na memória, portanto, quanto maior o índice, menos espaço de memória haverá para outros objetos e, é claro, isso incorrerá em mais E/S se o o buffer pool está frio.

    Embora seja um caso de uso um tanto raro (eu fiz isso uma ou talvez duas vezes, pelo que me lembro), o maior benefício desse tipo de índice é que ele ajudará muito as consultas que desejam usar uma junção de mesclagem para ingressar nesta tabela. (Observação: otimize a consulta primeiro se uma varredura de índice não for apropriada!) No plano de consulta, uma varredura do índice clusterizado ou uma varredura e classificação de um índice não clusterizado antes de uma junção de mesclagem pode fornecer uma indicação de quando isso pode seja uma boa ideia. Mas, novamente, isso é raro. A consulta deve ser executada com frequência suficiente ou a tabela base cara o suficiente para ficar presa na memória (ou seja, você não precisa dela o tempo todo), para justificar o armazenamento extra e a manutenção do índice.

    Se você não tiver certeza de como esse índice está sendo usado agora, verifique o DMV sys.dm_db_index_usage_stats. Lembre-se de que as contagens são redefinidas na reinicialização do servidor; portanto, se você estiver pensando em descartar o índice, certifique-se de que ele não seja útil durante todo o ciclo de negócios .

    • 8
  2. ManuH68
    2014-05-08T08:35:17+08:002014-05-08T08:35:17+08:00

    Deixe o SQL Server responder à sua pergunta, se o índice for útil, o Query Optimizer o usará, caso contrário, não.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve