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 / 7741
Accepted
Stuart Blackler
Stuart Blackler
Asked: 2011-11-11 13:31:59 +0800 CST2011-11-11 13:31:59 +0800 CST 2011-11-11 13:31:59 +0800 CST

Quando uma chave primária deve ser declarada sem cluster?

  • 772

Ao criar um banco de dados de teste para outra pergunta que fiz anteriormente, lembrei-me de que uma chave primária pode ser declaradaNONCLUSTERED

Quando você usaria uma NONCLUSTEREDchave primária em oposição a uma CLUSTEREDchave primária?

desde já, obrigado

sql-server primary-key
  • 5 5 respostas
  • 146321 Views

5 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2011-11-11T14:39:02+08:002011-11-11T14:39:02+08:00

    A questão não é 'quando o PK deve ser NC', mas você deve perguntar 'qual é a chave apropriada para o índice clusterizado'?

    E a resposta realmente depende de como você consulta os dados . O índice clusterizado tem uma vantagem sobre todos os outros índices: como sempre inclui todas as colunas, está sempre cobrindo. Portanto, as consultas que podem alavancar o índice clusterizado certamente não precisam usar pesquisas para satisfazer algumas das colunas e/ou predicados projetados.

    Outra peça do quebra-cabeça é como um índice pode ser usado ? Existem três padrões típicos:

    • sondas, quando um único valor de chave é procurado no índice
    • varreduras de intervalo, quando um intervalo de valores de chave é recuperado
    • ordem por requisitos, quando um índice pode satisfazer uma ordem sem exigir uma classificação stop-and-go

    Portanto, se você analisar sua carga esperada (as consultas) e descobrir que um grande número de consultas usaria um índice específico porque usa um determinado padrão de acesso que se beneficia de um índice, faz sentido propor esse índice como o índice clusterizado.

    Ainda outro fator é que a chave de índice clusterizado é a chave de pesquisa usada por todos os índices não clusterizados e, portanto, uma chave de índice clusterizada ampla cria um efeito cascata e amplia todos os índices não clusterizados e índices amplos significam mais páginas, mais E/S , mais memória, menos bondade.

    Um bom índice clusterizado é estável , não muda durante o tempo de vida da entidade, porque uma alteração nos valores da chave do índice clusterizado significa que a linha deve ser excluída e inserida novamente.

    E um bom índice clusterizado cresce para não aleatoriamente (cada valor de chave recém-inserido é maior que o valor anterior) para evitar divisões de página e fragmentação (sem mexer com FILLFACTORs).

    Agora que sabemos o que é uma boa chave de índice clusterizado, a chave primária (que é uma propriedade lógica de modelagem de dados) atende aos requisitos? Se sim, então o PK deve ser agrupado. Se não, então o PK não deve ser agrupado.

    Para dar um exemplo, considere uma tabela de fatos de vendas. Cada entrada tem um ID que é a chave primária. Mas a grande maioria das consultas pede dados entre uma data e outra data, portanto, a melhor chave de índice clusterizado seria a data de venda , não o ID . Outro exemplo de ter um índice clusterizado diferente da chave primária é uma chave de seletividade muito baixa, como uma 'categoria' ou um 'estado', uma chave com apenas poucos valores distintos. Ter uma chave de índice clusterizado com essa chave de baixa seletividade como a chave mais à esquerda, por exemplo (state, id), geralmente faz sentido devido a varreduras de intervalos que procuram todas as entradas em um 'estado' específico.

    Uma última observação sobre a possibilidade de uma chave primária não clusterizada em um heap (ou seja, não há nenhum índice clusterizado). Este pode ser um cenário válido, o motivo típico é quando o desempenho da inserção em massa é crítico, uma vez que os heaps têm um rendimento de inserção em massa significativamente melhor quando comparados aos índices clusterizados.

    • 217
  2. Ben Brocka
    2011-11-11T14:26:13+08:002011-11-11T14:26:13+08:00

    A razão básica para usar índices clusterizados é declarada na Wikipedia :

    O clustering altera o bloco de dados em uma determinada ordem distinta para corresponder ao índice, resultando no armazenamento dos dados de linha em ordem. Portanto, apenas um índice clusterizado pode ser criado em uma determinada tabela de banco de dados. Índices agrupados podem aumentar muito a velocidade geral de recuperação, mas geralmente apenas quando os dados são acessados ​​sequencialmente na mesma ordem ou na ordem inversa do índice agrupado ou quando um intervalo de itens é selecionado.

    Digamos que eu tenha uma tabela de Pessoas e essas pessoas tenham uma coluna País e uma Chave Primária exclusiva. É uma tabela demográfica, então essas são as únicas coisas que me interessam; qual país e quantas pessoas únicas estão ligadas a esse país.

    Assim, é provável que eu SELECT WHERE ou ORDER BY na coluna Country; um índice clusterizado na Chave Primária não me faz bem, não estou acessando esses dados por PK, estou acessando por essa outra coluna. Como só posso ter um índice clusterizado em uma tabela, declarar meu PK como Clusterizado me impediria de usar um Índice Clusterizado no País.

    Além disso, aqui está um bom artigo sobre Índices clusterizados vs não clusterizados, verifica-se que os índices clusterizados causaram problemas de desempenho de inserção no SQL Server 6.5 (o que, pelo menos, esperamos que não seja relevante para a maioria de nós aqui).

    Se você colocar um índice clusterizado em uma coluna IDENTITY, todas as suas inserções acontecerão na última página da tabela - e essa página será bloqueada pela duração de cada IDENTITY. Não é grande coisa... a menos que você tenha 5.000 pessoas que querem a última página. Então você tem muita disputa por essa página

    Observe que este não é o caso em versões posteriores.

    • 28
  3. Bryan Johns
    2012-11-29T20:07:29+08:002012-11-29T20:07:29+08:00

    Se sua chave primária for do UNIQUEIDENTIFIERtipo , certifique-se de especificar que é NONCLUSTERED. Se você fizer isso em cluster, cada inserção terá que fazer um monte de embaralhamento de registros para inserir a nova linha na posição correta. Isso irá reduzir o desempenho.

    • 23
  4. Thomas Franz
    2016-04-20T23:10:51+08:002016-04-20T23:10:51+08:00

    Um exemplo muito comum:

    • Customermesa com CustomerIDcomoCLUSTERED PRIMARY KEY
    • Tabela de pedidos com OrderID (PK), CustomerID, OrderDatee algumas outras colunas
    • OrderPositionscomOrderPositionID (PK), OrderId, ProductID, Amount, Price ...
    • você tem que indexar as tabelas de pedidos

    Claro que "depende" é - como quase sempre - a resposta correta, mas a maioria dos aplicativos (não BI-Reports) funcionará com base no cliente (por exemplo, você faz login como cliente 278 no site e clica em "Meus pedidos" ou o atendente lista todos os pedidos do cliente 4569 ou sua rotina de faturas resumirá todos os pedidos do cliente 137).

    Nesse caso, não faria muito sentido agrupar a tabela pelo OrderID. Sim, você terá consultas SELECT ... WHERE OrderId = ?para listar os detalhes do pedido, mas isso geralmente seria uma busca de índice curta e barata (3 leituras).

    Por outro lado, se você agrupasse sua Ordertabela por CustomerID, ela não teria que fazer várias pesquisas de chave toda vez que você consultasse a tabela por CustomerId = ?.

    O CLUSTERED INDEXdeve ser sempre UNIQUE, caso contrário, o SQL Server adicionaria uma coluna INT invisível (= inutilizável) UNIQUIFIERpara garantir a unicidade - e faria muito mais sentido adicionar dados reais (utilizáveis) do que algumas coisas aleatórias (dependendo da ordem de inserção).

    Como um cliente fará (espero) mais de um pedido, teríamos que adicionar o OrderIDou (se você costuma classificar por isso) o OrderDate(se for uma data e hora - caso contrário, o cliente estaria limitado a um pedido por dia) para o CLUSTERED INDEXe termina com:

    CREATE UNIQUE CLUSTERED INDEX IX_Orders_UQ on Orders (CustomerID, OrderID)

    As mesmas regras se aplicam à OrderPositionsmesa. Normalmente, a maioria das consultas listará todas as posições em uma ordem específica, então você deve criar o PK com o OrderPositionIDas NONCLUSTEREDe um UNIQUE CLUSTERED INDEXon OrderId, OrderPositionID.

    BTW: é correto que a Customertabela seja agrupada por seu PK (o CustomerID, porque é uma "Tabela de nível superior" e será - em um aplicativo típico - principalmente consultada por seu CustomerID.

    Tabelas de pesquisa puras como por exemplo Gendersou InvoiceTypesou PaymentTypesão outro exemplo de tabelas que devem ser agrupadas por seu PK (porque você geralmente as unirá em GenderId, InvoiceTypeIdou PaymentTypeId).

    • 9
  5. crokusek
    2013-04-17T14:44:04+08:002013-04-17T14:44:04+08:00

    Quando um índice clusterizado é considerado mais benéfico para o sistema geral do que um PK clusterizado usando alguma medida de desempenho. Só pode haver um índice clusterizado em uma tabela.

    Exemplos de medidas de desempenho são tempo de consulta única (velocidade), integração do tempo total de consulta em relação à tabela (eficiência) e ter que adicionar muitas colunas de inclusão a um índice não clusterizado muito grande para obter desempenho semelhante ao clusterizado (tamanho ).

    Isso pode acontecer quando os dados geralmente são recuperados usando um índice que não é exclusivo, contém nulos (não permitido em um PK) ou o PK foi adicionado por um motivo secundário (como replicação ou identificação de registro de trilha de auditoria).

    • 2

relate perguntas

  • Chaves primárias de caractere x número inteiro

  • 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

    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