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 / 5704
Accepted
RPK
RPK
Asked: 2011-09-14 07:40:05 +0800 CST2011-09-14 07:40:05 +0800 CST 2011-09-14 07:40:05 +0800 CST

Por que a propriedade Clustered Index está habilitada em algumas colunas e não em outras?

  • 772

Ouvi dizer que só pode haver um índice agrupado? Posso estar errado, mas tenho certeza que li em algum lugar.

Em uma das minhas tabelas do SQL Server 2005, tenho as seguintes colunas:

SerialNum -------- BigInt -------- Chave Primária

Distrito -------- nvarchar(50)

SchemeType ------ nvarchar(50)

Quando abro a tabela no modo de design usando o SQL Server Management Studio, noto que a propriedade Clustered Index está habilitada para District , enquanto está desabilitada para SchemeType .

Se pode haver apenas um índice clusterizado, por que District tem essa propriedade habilitada quando SerialNum já está definido como chave primária?

Se pode haver mais índices clusterizados, como habilitar essa propriedade para a coluna SchemeType ?

sql-server database-design
  • 4 4 respostas
  • 2253 Views

4 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2011-09-14T07:57:01+08:002011-09-14T07:57:01+08:00

    Chave primária e índice clusterizado são duas coisas diferentes, embora sejam frequentemente usados ​​em conjunto. Algumas possíveis razões pelas quais sua tabela acabou assim:

    (a) poderia ter sido criado com uma chave primária não clusterizadaPRIMARY KEY NONCLUSTERED usando , então o índice clusterizado foi adicionado.

    (b) o índice clusterizado poderia ter sido adicionado e, em seguida, a chave primária adicionada (nesse caso, não pode ser agrupado, pois já existe um índice clusterizado).

    Qualquer um desses poderia ter sido decisões intencionais de design, acidentes, mudanças em pensamentos posteriores, etc.

    Ignore a propriedade na exibição de design do Management Studio. O índice clusterizado é a tabela, mas é definido pela(s) coluna(s) especificada(s). As outras colunas ainda fazem parte tecnicamente do índice clusterizado, mas não são colunas-chave no índice. Chamar isso de "ativado/desativado" é enganoso.

    • 6
  2. Marian
    2011-09-14T07:46:07+08:002011-09-14T07:46:07+08:00

    Só pode haver um índice clusterizado, porque o índice clusterizado são os próprios dados da tabela. É uma forma de organizar os dados da tabela com base em uma chave de agrupamento. É semelhante às tabelas organizadas por índice (IOT) da Oracle. Índices não clusterizados são estruturas de dados separadas. Os índices agrupados são os próprios dados organizados como uma b-tree.

    Por padrão, o SQL Server torna a chave primária como um índice clusterizado, se ainda não houver um. Parece que, no seu caso, a chave primária foi criada como um 'índice não agrupado' e a coluna District como um 'índice agrupado'.

    • 3
  3. StanleyJohns
    2011-09-14T15:28:28+08:002011-09-14T15:28:28+08:00

    Você pode ter apenas um índice clusterizado por tabela. Uma chave primária não é um índice clusterizado. Para responder às suas perguntas:

    Se pode haver apenas um índice clusterizado, por que District tem essa propriedade habilitada quando SerialNum já está definido como chave primária? Isso ocorre porque o índice clusterizado é criado em District. Somente isso aparecerá como ativado e o restante como desativado.

    Se pode haver mais índices clusterizados, como habilitar essa propriedade para a coluna SchemeType? Você não pode ter mais de um índice clusterizado em uma tabela. Você terá que descartar o índice clusterizado em District e recriar um para SchemeType. Se você ainda deseja manter o índice clusterizado em District, um truque que pode usar é criar uma exibição indexada e, em seguida, criar um índice clusterizado na exibição de SchemeType. Você pode precisar da edição Enterprise para isso.

    • 1
  4. GregW
    2011-09-16T10:03:52+08:002011-09-16T10:03:52+08:00
    • No MySQL, que vejo em outras postagens que você usa, a chave primária e o índice clusterizado são sempre os mesmos.
    • No SQL Server, eles podem ser diferentes.
    • No SQL Server, só pode haver um índice clusterizado. O índice clusterizado garantirá que a tabela seja ordenada fisicamente de acordo com esse índice.
    • É claro que você pode ter muitos índices não clusterizados além de seu único índice clusterizado e, normalmente, você terá um clusterizado e um ou alguns índices não clusterizados em algumas de suas tabelas.
    • Normalmente, no SQL Server, as chaves primárias têm o índice clusterizado (e acho que é o padrão), mas é possível configurar outra coluna (ou colunas) com o índice clusterizado.
    • É até possível ter duas ou mais colunas nesse índice clusterizado. Você não diz se a coluna SerialNum também está agrupada ou não, mas se você perceber que ambas estão agrupadas, terá um único índice que abrange duas colunas e haverá uma propriedade de inteiro de ordem de agrupamento que será a ordem em que esses as colunas determinam o layout da tabela física (por exemplo, "ordenado por Distrito primeiro e dentro do distrito, ordenado por SerialNum"). Observe que adicionar mais colunas a esse índice clusterizado tenderá a reduzir o desempenho em vez de melhorá-lo, a menos que a ordem física corresponda exatamente aos principais casos de consulta nessa tabela o suficiente para superar a penalidade de desempenho INSERT reduzida que acompanha a garantia dessa ordem física.
    • Em seu sistema, se o distrito estiver agrupado (mas SerialNum não), isso pode ser um bom design se as consultas nessa tabela se juntarem com mais frequência a "Distrito" ou filtrarem "Distrito" do que "Número de série". (Eu vi esse tipo de coisa em cenários onde algo como SerialNum é uma chave substituta auto-incrementada que não é muito usada em outros lugares em seu modelo de dados e se usuários finais/aplicativos/relatórios tiverem joins/where/groupby/ cláusulas orderby com District, mas raramente ou nunca contra SerialNum.)
    • 0

relate perguntas

  • 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?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • 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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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