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 / 51349
Accepted
u23432534
u23432534
Asked: 2013-10-11 13:40:49 +0800 CST2013-10-11 13:40:49 +0800 CST 2013-10-11 13:40:49 +0800 CST

A ordem da coluna da chave primária agrupada composta em uma tabela particionada?

  • 772

Eu tenho a seguinte tabela.

create table T (K1 date, K2 int references S(Id), ....) on partitionScheme(K1)

A tabela será particionada por K1 (K1 tem baixa seletiva. os dados serão anexados na ordem por K1). Qual das seguintes chaves primárias (a ordem das colunas é diferente) é preferida?

alter table T add primary key clustered (K1, K2)
alter table T add primary key clustered (K2, K1)

Ou o PK deve ser não clusterizado e criar outro índice clusterizado?

Muitas das consultas se parecem com:

select ....
from T join S on S.Id = T.K2
where ....
sql-server sql-server-2008
  • 4 4 respostas
  • 3064 Views

4 respostas

  • Voted
  1. Best Answer
    Paul White
    2016-05-22T21:13:15+08:002016-05-22T21:13:15+08:00

    Qual das seguintes chaves primárias (a ordem das colunas é diferente) é preferida?

    Como todas as decisões de indexação, muito depende de como a tabela será consultada.

    Todos os índices particionados (para SQL Server 2008 e posterior) têm o ID da partição (não o valor da chave de particionamento ) como uma coluna de chave inicial oculta em cada índice particionado, portanto, as definições concorrentes efetivas são:

    PartitionID, K1, K2
    contra
    PartitionID, K2, K1

    Isso afeta a utilidade de cada índice para diferentes tipos de consultas, como seria de esperar. A principal consideração extra é que as buscas de desigualdade na primeira chave real (K1 ou K2) ainda são suportadas, independentemente de qualquer busca de desigualdade e/ou operações de eliminação de partição na coluna PartitionID .

    Por exemplo, a especificação de índice (K1, K2) pode buscar um intervalo de partições e um intervalo de valores K1 simultaneamente:

    SELECT T1.* 
    FROM dbo.T1 AS T1
    WHERE 1 = 1
    AND T1.K1 >= CONVERT(date, '20080711', 112)
    AND T1.K1 <= CONVERT(date, '20100711', 112);
    

    Busca de desigualdade multinível

    A mesma consulta em uma tabela com (K2, K1) como a chave de índice clusterizado poderia procurar encontrar o intervalo de partições, mas teria que varrer completamente cada partição qualificada para localizar as linhas que correspondem exatamente aos predicados K1. Para ser claro, o teste de valores K1 seria aplicado como um predicado residual, não como uma operação de busca.

    Isso será exibido como uma varredura de índice clusterizado no plano de execução, com uma busca de eliminação de partição e um predicado residual nos valores K1:

    Verificação de eliminação de partição com predicado residual

    Um ponto sutil ao usar o tipo de dados de data como a chave de particionamento é que você deve ter cuidado ao usar tipos de data explícitos em suas consultas se espera que a eliminação da partição ocorra de maneira confiável. O uso de outros tipos, como datetime , é feito facilmente (por acidente), mas geralmente impede a eliminação, onde seria logicamente esperado.

    Por exemplo, esta consulta tocará todas as partições:

    DECLARE @dt datetime = '20080711';
    
    SELECT * 
    FROM dbo.T1 AS T1
    WHERE T1.K1 = @dt;
    

    Considerando que esta consulta afetará apenas uma única partição:

    DECLARE @dt date = '20080711';
    
    SELECT * 
    FROM dbo.T1 AS T1
    WHERE T1.K1 = @dt;
    

    Ambas as consultas parecem superficialmente idênticas no plano de execução gráfico (uma busca de índice agrupado). Você precisa verificar as propriedades do operador em detalhes para verificar se a eliminação de partição estática ou dinâmica está sendo aplicada.

    Para o exemplo de consulta de junção fornecida na pergunta: Ambas as estratégias de indexação incluem a coluna K2, mas nenhuma delas geralmente pode fornecer linhas na ordem K2 sem uma classificação. Como resultado, qualquer índice é igualmente bom para um hash ou junção de loops aninhados, mas nenhum deles pode fornecer a ordem de entrada necessária para uma junção de mesclagem em K2.

    Isso pode parecer contra-intuitivo para o índice (K2, K1), mas lembre-se da chave PartitionID inicial . Cada partição tem linhas na ordem (K2, K1). A menos que exatamente uma partição seja especificada na consulta, uma classificação será necessária para retornar as linhas na ordem K2. O índice (K1, K2) só pode retornar linhas na ordem K2 para uma única partição e um único valor fornecido de K1.

    A chave primária em cluster proposta (K1, K2) tem a vantagem potencial de minimizar as divisões de página da tabela base se os dados anexados forem realmente classificados pela chave de clustering durante a operação de inserção. Para o índice (K1, K2), isso significaria linhas classificadas por (PartitionID, K1, K2). Para (K2, K1), seria (PartitionID, K2, K1).

    Leitura relacionada: Melhorias no processamento de consultas em tabelas e índices particionados

    • 7
  2. Kenneth Fisher
    2014-10-31T06:43:13+08:002014-10-31T06:43:13+08:00

    Como você está fazendo sua chave primária em cluster, se você olhar neste artigo da Technet sobre o alinhamento de índices com partições , ele menciona na seção Índices clusterizados que, se você não incluir a coluna de particionamento no índice clusterizado, isso será feito para você. Ambas as opções incluem a coluna de particionamento, portanto, isso não é um problema, mas provavelmente deve ser lembrado.

    Tudo isso dito, nada do que li diz que faz alguma diferença, desde que o índice clusterizado contenha a coluna de particionamento (tornando-o alinhado). Pessoalmente, eu provavelmente colocaria a coluna particionada primeiro. Na minha opinião, isso parece permitir que o SQL decida em qual partição procurar antes de examinar qualquer outra coluna no índice.

    Com base nas informações fornecidas, não há necessidade real de ter PK e CIX separados neste caso. Isso obviamente pressupõe que a combinação de K1, K2 é única.

    • 5
  3. SMS
    2014-08-17T12:41:38+08:002014-08-17T12:41:38+08:00

    Você não precisa incluir sua chave de partição em seu índice clusterizado se a própria chave primária não for particionada.

    Você pode criar uma coluna de identidade para servir como a chave primária e o valor agrupado, mas particionar a tabela por outro valor.

    Essa seria minha preferência porque resultaria em índices menores porque a chave do cluster é menor.

    CREATE TABLE [T] (TId int identity, K1 date, K2 int, K3 varchar(10), ...) 
    ON PartitionScheme(K1)
    
    ALTER TABLE T ADD PRIMARY KEY CLUSTERED (TId) ON [primary]
    
    • -3
  4. dimitar
    2014-10-31T01:25:31+08:002014-10-31T01:25:31+08:00

    se você tiver um campo de identidade, PK deve estar em 'K1' e 'id_filed'

    create table  T (...) 
    on partitionscheme(K1)
    
    alter table T add primary key clustred (K1,id_field) on partitionscheme(K1)
    

    se não

    alter table T add primary key clustred (K1) on partitionscheme(K1)
    

    , mas o índice clusterizado sempre deve estar no mesmo grupo de arquivos que a tabela.

    • -3

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

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

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