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 / 275721
Accepted
Franz Biberkopf
Franz Biberkopf
Asked: 2020-09-19 07:16:17 +0800 CST2020-09-19 07:16:17 +0800 CST 2020-09-19 07:16:17 +0800 CST

O que significa que um "índice clusterizado não armazena ponteiros para os dados"? [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Incompreensão do Índice Agrupado (2 respostas)
Todos os DBMSes relacionais armazenam tuplas de tabela em um índice clusterizado com base na chave primária por padrão? (3 respostas)
Fechado há 2 anos .

Sou iniciante em SQL e Administração de Banco de Dados e estou tentando entender a diferença entre índices clusterizados e não clusterizados. Mais ou menos eu entendi quais são as diferentes tarefas, mas tenho alguns problemas quando se trata da questão dos "ponteiros". Eu não venho de CS então tenho algum problema em imaginar o que acontece no "nível folha" com os ponteiros e de que forma eles conectam o índice aos dados. Então, o que significa que um índice clusterizado não armazena ponteiros para os dados, enquanto o não clusterizado armazena?

Desculpe antecipadamente se essas perguntas parecem estúpidas, mas neste momento estou bastante confuso!

clustered-index nonclustered-index
  • 2 2 respostas
  • 305 Views

2 respostas

  • Voted
  1. Best Answer
    BradC
    2020-09-19T07:37:39+08:002020-09-19T07:37:39+08:00

    Não, essa não é uma pergunta ruim.

    No MS SQL Server (e outros que funcionam de maneira semelhante), um índice clusterizado não armazena ponteiros para os dados porque não precisa , um índice clusterizado na verdade contém os próprios dados da tabela .

    Um índice clusterizado é a tabela, apenas ordenada de uma maneira particular.

    Se você criar e preencher uma nova tabela sem índice clusterizado (chamado de "heap") e adicionar um índice não clusterizado , estará criando um novo objeto (ordenado) que ainda precisa apontar para as linhas no mesa .

    Mas se você pegar esse heap e adicionar um índice clusterizado, estará literalmente reordenando a própria tabela .

    • 1
  2. David Spillett
    2020-09-19T08:35:33+08:002020-09-19T08:35:33+08:00

    Um heap é apenas um monte de páginas com linhas, não há realmente nenhuma informação sobre onde está o SQL Server mantendo o controle de "essa tabela é representada por esta lista de páginas". Para encontrar qualquer coisa, ele precisa escanear todo o lote (a menos que você use TOP 1ou TOP <n>ou OFFSET/ FETCHnesse caso ele pode escanear até que linhas suficientes sejam encontradas).

    Um índice é uma estrutura de árvore que torna a localização de coisas muito mais rápida do que a varredura de tudo. Não entrarei em detalhes sobre estruturas de índice/árvore (veja o golpe para uma referência útil), mas usar um índice significa que você pode encontrar uma coisa específica em apenas algumas leituras de página em vez de muitos milhares. As árvores têm um nó raiz na parte superior, nós folha na camada inferior e nós de ramificação no meio.

    Um índice não clusterizado em um heap no SQL Server tem em seus nós folha referências para onde os dados estão no banco de dados: o arquivo, a página e o número da linha nessa página. Então, uma vez que você chega ao final da árvore, você ainda tem que ler a página, potencialmente uma por linha encontrada, se houver muitas correspondências.

    Um índice clusterizado no SQL Server (o termo significa algo um pouco diferente no postgres e em outros lugares) contém os dados reais da linha nos nós folha: não são necessárias pesquisas extras. É por isso que os índices clusterizados são particularmente úteis para consultas de intervalo: você pode encontrar os dados de várias, talvez algumas centenas de linhas que correspondam ao filtro, todas na mesma página, portanto, não há mais pesquisas a serem feitas.

    Um índice não clusterizado em uma tabela com um índice clusterizado é muito semelhante a um em um heap. A diferença é que, em vez dos nós folha contendo ponteiros para onde os dados estão no heap, eles contêm a chave de cluster para a linha para que os dados extras possam ser encontrados por meio do índice clusterizado (a menos que tudo o que você precisa esteja contido nos valores indexados, os INCLUDEDvalores e a chave de clustering, caso em que não são necessárias mais pesquisas).

    Pode parecer que um índice não clusterizado em uma tabela clusterizada pode ser menos eficiente do que em uma não clusterizada, mas a pesquisa no índice clusterizado será apenas uma página ou poucas e existem outros fatores que podem tornar o pesquisa de heap é menos eficiente do que ler a página apontada pelo índice, e heaps também podem ser ineficientes de outras maneiras.

    Consulte os documentos oficiais em https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide#Clustered para obter mais detalhes e alguns diagramas. Ou se você tiver um pouco de tempo para aprender brincando, experimente o How To Think Like SQL Server de Brent Ozar .

    • 1

relate perguntas

  • O que acontece com o índice não clusterizado quando a coluna incluída é atualizada usando a instrução de atualização?

  • O índice clusterizado é sempre melhor que o índice não clusterizado?

  • Desempenho de índices não agrupados em heaps versus índices agrupados

  • O conceito de um índice clusterizado em um design de banco de dados faz sentido ao usar SSDs?

  • O que é um índice agrupado?

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