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 / 108952
Accepted
sharptooth
sharptooth
Asked: 2015-08-05 03:28:18 +0800 CST2015-08-05 03:28:18 +0800 CST 2015-08-05 03:28:18 +0800 CST

Por que a restrição PK requer um índice separado quando eu já tenho um índice clusterizado exclusivo adequado?

  • 772

Isso faz parte da definição da tabela daqui :

CREATE TABLE [dbo].[JobItems] (
[ItemId]            UNIQUEIDENTIFIER NOT NULL,
-- lots of other columns
CONSTRAINT [PrimaryKey_GUID_HERE] PRIMARY KEY NONCLUSTERED ([ItemId] ASC)
);

CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex]
ON [dbo].[JobItems]([ItemId] ASC);

Este é um design herdado, então, por favor, não pergunte "por quê". De qualquer forma, quando procuro a lista de índices, vejo que há dois índices - um deles é JobItemsIndexe o outro é PK-GUID-HEREe ambos são para JobItemstabela.

Minha pergunta é...

Por que há necessidade de um índice separado para manter o PK quando eu já tenho JobItemsIndexum único e inclui a mesma coluna e, portanto, adequado para manter a restrição PK?

sql-server index
  • 3 3 respostas
  • 406 Views

3 respostas

  • Voted
  1. Rob Farley
    2015-08-05T05:13:11+08:002015-08-05T05:13:11+08:00

    Não precisa de um índice separado. Só é feito dessa forma porque você realmente disse que estava no script. Você poderia fazer isso com a mesma funcionalidade:

    CREATE TABLE [dbo].[JobItems] (
    [ItemId]            UNIQUEIDENTIFIER NOT NULL,
    -- lots of other columns
    CONSTRAINT [JobItemsIndex] PRIMARY KEY CLUSTERED ([ItemId] ASC)
    );
    
    • 6
  2. Best Answer
    Erik
    2015-08-06T18:56:14+08:002015-08-06T18:56:14+08:00

    As outras duas respostas estão corretas porque os dois índices existem: você disse ao banco de dados para criar dois índices. Além disso, você pode agrupar sua chave primária e remover o segundo índice.

    Responder à sua pergunta sobre por que o segundo índice é "necessário" resume-se a uma limitação/requisito para bancos de dados do Sql Server Azure edition que não está presente em outras versões do Sql Server. Sql Server Enterprise/Standard/Express suporta todas as tabelas de heap. A edição SQL Server Azure não dá suporte a tabelas de heap. Meu palpite é que em algum momento eles queriam que a tabela "JobItems" fosse uma tabela heap. Quando chegou a hora de colocar o banco de dados na nuvem, eles foram forçados a ter um índice clusterizado na tabela. O desenvolvedor optou por criar um índice duplicado que é clusterizado em vez de alterar a chave primária de não clusterizada para clusterizada. Por que eles escolheram isso, talvez nunca saibamos... No entanto, esse parece ser um caminho plausível para sua situação, especialmente se essa tabela "herdada" residir fora do Azure em algum momento de sua vida.

    Também pode ser útil revisar esta pergunta e esta pergunta no StackOverflow, onde eles discutem índices clusterizados e não clusterizados na mesma coluna. A resposta mais bem avaliada na primeira pergunta afirma que pode haver um aumento de desempenho em ter os dois índices. As respostas para a segunda pergunta basicamente reiteram com mais detalhes o que outros já disseram em resposta à sua pergunta.

    • 4
  3. Kenneth Fisher
    2015-08-05T05:23:58+08:002015-08-05T05:23:58+08:00

    No seu caso particular, isso realmente não importa, pois seu índice clusterizado exclusivo e sua chave primária estão na (s) mesma (s) coluna (s), mas há duas pequenas diferenças entre os dois.

    • Uma chave primária requer que todas as colunas sejam não anuláveis.
    • Uma chave única permite valores NULL.

    • Você pode ter apenas uma chave primária.

    • Você pode ter várias chaves exclusivas.

    Qualquer um pode ser agrupado. E você pode ter apenas uma chave agrupada.

    No seu caso, no entanto, como sua chave primária e seu índice são idênticos, você pode facilmente descartar ambos e recriar sua chave primária como um índice clusterizado. Dito isto, se for uma mesa grande, não tenho certeza se me incomodaria. Eu provavelmente descartaria a chave primária (sem motivo para mantê-la) e viveria com o índice exclusivo clusterizado. Caso você esteja preocupado , isso NÃO o torna um HEAP . Você tem um índice clusterizado para não ter um heap.

    • 3

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

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

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

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