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 / 6468
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2011-10-04 18:09:27 +0800 CST2011-10-04 18:09:27 +0800 CST 2011-10-04 18:09:27 +0800 CST

Quais são as considerações de desempenho entre usar um PK amplo versus uma chave sintética separada e UQ?

  • 772

Eu tenho várias tabelas onde os registros podem ser identificados exclusivamente com vários campos de negócios amplos. No passado, usei esses campos como um PK, com os seguintes benefícios em mente:

  • Simplicidade; não há campos estranhos e apenas um índice
  • O agrupamento permite junções de mesclagem rápidas e filtros baseados em intervalo

No entanto, ouvi um caso feito para criar um IDENTITY INTPK sintético e, em vez disso, impor a chave de negócios com uma UNIQUErestrição separada. A vantagem é que o PK estreito resulta em índices secundários muito menores.

Se uma tabela não tiver índices além do PK, não vejo nenhuma razão para favorecer a segunda abordagem, embora em uma tabela grande seja provavelmente melhor assumir que os índices podem ser necessários no futuro e, portanto, favorecer o PK sintético estreito . Estou perdendo alguma consideração?

Aliás, não estou argumentando contra o uso de chaves sintéticas em data warehouses, estou apenas interessado em quando usar um único PK amplo e quando usar um PK estreito mais um UK amplo.

database-design primary-key
  • 4 4 respostas
  • 845 Views

4 respostas

  • Voted
  1. Best Answer
    gbn
    2011-10-04T20:49:39+08:002011-10-04T20:49:39+08:00

    Não há desvantagem significativa usando a chave natural como o índice clusterizado

    • não há índices não agrupados
    • nenhuma chave estrangeira referenciando esta tabela (é uma linha pai)

    A desvantagem seria o aumento das divisões de página, pois as inserções de dados seriam distribuídas pelos dados, em vez de no final.

    Onde você tem índices FKs ou NC, o uso de um índice clusterizado crescente e numérico tem vantagens. Você repete apenas alguns bytes de dados por entrada NC ou FK, não a chave natural/business while.

    Quanto ao porquê, leia também os 5 artigos do Google

    Observe que evitei o uso de "chave primária".

    Você pode ter o índice clusterizado na chave substituta, mas manter o PK nas regras de negócios, mas como não clusterizado. Apenas certifique-se de que o cluster é exclusivo porque o SQL adicionará um "uniquificador" para torná-lo único.

    Finalmente, pode fazer sentido ter uma chave substituta, mas não cegamente em todas as tabelas : muitas tabelas não precisam de uma, ou onde uma chave composta das tabelas pai será suficiente

    • 11
  2. Mike Sherrill 'Cat Recall'
    2011-10-05T17:00:28+08:002011-10-05T17:00:28+08:00

    Embora eu arrisque afirmar o óbvio, um índice em uma chave substituta (um número de identificação) é útil se você precisar localizar coisas por seu número de identificação. Os usuários não vão lidar com o número de identificação; eles vão lidar com texto legível por humanos. Portanto, você precisa passar muito o texto e seu número de identificação, para que a interface do usuário possa exibir o texto e operar no número de identificação.

    O dbms usará esse tipo de índice para suportar chaves estrangeiras, se você as definir dessa maneira.

    Às vezes, você pode melhorar o desempenho usando números de identificação como chaves estrangeiras, mas não é uma melhoria absoluta. Em nosso sistema OLTP, as chaves estrangeiras que usam chaves naturais superaram as chaves estrangeiras que usam números de identificação em um conjunto de testes de cerca de 130 (eu acho) consultas representativas. (Como as informações importantes geralmente são carregadas nas chaves, o uso de chaves naturais evitou muitas junções.) A aceleração média foi um fator de 85 (junções usando números de identificação levaram 85 vezes mais para retornar linhas).

    Testes mostraram que junções em números de id não funcionariam mais rápido do que leituras em chaves naturais em nosso banco de dados até que certas tabelas atingissem muitos milhões de linhas. A largura da linha tem muito a ver com isso - linhas mais largas significam que menos linhas cabem em uma página, então você tem que ler mais páginas para obter 'n' linhas. Quase todas as nossas tabelas estão em 5NF; a maioria das tabelas são bastante estreitas.

    No momento em que as junções começam a executar leituras simples aqui , colocar tabelas e índices críticos em um disco de estado sólido pode nivelar o desempenho em centenas de milhões de linhas.

    • 4
  3. Catalin Adler
    2011-10-04T21:29:39+08:002011-10-04T21:29:39+08:00

    Eu tenho um banco de dados oltp inteiro projetado usando colunas de identidade para clustering + pk. Funciona muito rápido em inserts/buscas, mas eu vi alguns problemas:
    1. a opção de preenchimento de índice é inútil porque as inserções acontecem apenas no final do índice
    2. mais espaço de armazenamento. Tenho tabelas com dezenas de milhões de registros e 1 int ocupa espaço sozinho. Cada tabela com uma coluna de identidade para seu pk deve ter outro índice para buscas de negócios, portanto, ainda mais armazenamento necessário.
    3. escalabilidade. Este é o pior problema. Como cada inserção vai até o final do índice, cada inserção enfatizará apenas o final do índice (alocação, io para gravações etc.). Usando uma chave comercial como uma chave de agrupamento, você pode distribuir as inserções uniformemente no índice. Isso significa que você acabou de eliminar um grande ponto de acesso. Você pode facilmente usar mais arquivos para um índice, cada arquivo em uma unidade separada, cada unidade trabalhando separadamente.

    Comecei a mudar minhas tabelas de colunas de identidade para chaves naturais (talvez separadas para clustering e pk). Só me sinto melhor agora.

    Eu sugeriria o seguinte (pelo menos para um banco de dados oltp):
    1. use como chave de agrupamento as colunas certas na ordem certa para otimizar as consultas mais frequentes
    2. use um pk as colunas certas que fazem sentido para sua tabela

    Se a chave agrupada não for simples e contiver caracteres (char[], varchar, nvarchar), acho que a resposta é 'depende', você deve analisar individualmente cada caso.

    Eu mantenho o seguinte princípio: otimizar para a consulta mais comum, minimizando o pior cenário.

    Quase esqueci um exemplo. Eu tenho algumas tabelas que fazem referência a si mesmas. Se essa tabela tiver uma coluna de identidade para sua chave primária, inserir uma linha pode exigir uma atualização e inserir mais de uma linha por vez pode ser difícil, se não impossível (depende do design da tabela).

    • 3
  4. nvogel
    2011-10-14T20:45:47+08:002011-10-14T20:45:47+08:00

    Do ponto de vista do desempenho, a escolha de qual tecla é a chave "primária" não faz nenhuma diferença. Não há diferença entre usar uma PRIMARY KEY e uma restrição UNIQUE para impor suas chaves.

    O desempenho é determinado pela seleção e tipo de índices e outras opções de armazenamento e pela forma como as chaves são usadas em consultas e códigos.

    • 2

relate perguntas

  • Quais são as desvantagens de usar UUID ou GUID como chave primária?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

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

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

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