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 / 172297
Accepted
BradC
BradC
Asked: 2017-04-29 14:10:35 +0800 CST2017-04-29 14:10:35 +0800 CST 2017-04-29 14:10:35 +0800 CST

Adicionando um campo de identidade para ser o novo cluster de uma tabela grande - como faço para obter a ordem "certa"?

  • 772

Eu tenho uma tabela muito grande (88 milhões de linhas, quase 300 GB de tamanho) que possui um índice clusterizado mal planejado. Eu quero adicionar um BIGINTcampo de identidade e torná-lo o novo índice clusterizado (tendo os atributos desejáveis ​​de unique, narrow, static e sempre crescente ).

O problema é que também quero que esse novo campo de identidade seja ordenado de uma certa maneira nos registros atuais (com base em um campo de data existente que não seja o cluster atual). Assim, quando limparmos os registros mais antigos, todos eles ficarão contíguos no disco. (O campo de data não é exclusivo, portanto, não é um bom candidato para o cluster por si só.)

Como posso obter os valores desse novo campo de identidade ordenados da maneira que desejo?

A primeira ideia que tive foi fazer uma nova tabela com o campo de identificação, e apenas INSERT INTOas linhas da tabela atual ORDER BYo campo de data? Isso funcionaria?

Se eu não tiver espaço em disco suficiente para fazer isso, existe alguma maneira de fazer isso "no local"? Talvez alterando o índice clusterizado para o campo de data (aguarde muito tempo) e adicione a identidade (e aguarde muito tempo novamente)? Os valores da identidade são garantidos para serem ordenados pelo cluster atual?

sql-server-2012 clustered-index
  • 1 1 respostas
  • 267 Views

1 respostas

  • Voted
  1. Best Answer
    RDFozz
    2017-04-29T16:33:23+08:002017-04-29T16:33:23+08:00

    Acabei de realizar o seguinte experimento em uma caixa do SQL Server 2012:

    CREATE TABLE rdtest (label varchar(100), value int);
    
    INSERT INTO rdtest VALUES
           ('one', 1)
          ,('two', 4)
          ,('three', 9)
          ,('four', 16)
          ,('five', 25)
    ;
    
    ALTER TABLE rdtest ADD test_id int IDENTITY(1,1);
    
    SELECT * FROM rdtest;
    

    Resultado:

    label    value       test_id
    -------- ----------- -----------
    one      1           1
    two      4           2
    three    9           3
    four     16          4
    five     25          5
    

    Próximo:

    ALTER TABLE rdtest DROP COLUMN test_id;
    
    ALTER TABLE rdtest ALTER COLUMN value int NOT NULL;
    GO
    
    ALTER TABLE rdtest ADD CONSTRAINT PK_rdtest PRIMARY KEY ([value] DESC);
    
    ALTER TABLE rdtest ADD test_id int IDENTITY(1,1);
    
    SELECT * FROM rdtest;
    

    Resultados:

    label    value       test_id
    -------- ----------- -----------
    five     25          1
    four     16          2
    three    9           3
    two      4           4
    one      1           5
    

    E mais um teste:

    ALTER TABLE rdtest DROP CONSTRAINT PK_rdtest;
    
    ALTER TABLE rdtest DROP COLUMN test_id;
    
    ALTER TABLE rdtest ALTER COLUMN label varchar(100) NOT NULL;
    GO
    
    ALTER TABLE rdtest ADD CONSTRAINT PK_rdtest PRIMARY KEY ([label] ASC);
    
    ALTER TABLE rdtest ADD test_id int IDENTITY(1,1);
    
    SELECT * FROM rdtest;
    

    Resultados:

    label    value       test_id
    -------- ----------- -----------
    five     25          1
    four     16          2
    one      1           3
    three    9           4
    two      4           5
    

    Suponho que isso não seja uma garantia de que o índice clusterizado dite a ordem em que uma nova coluna IDENTITY é preenchida - mas eu diria que indica fortemente que é muito provável.

    • 2

relate perguntas

  • O conceito de um índice clusterizado em um design de banco de dados faz sentido ao usar SSDs?

  • Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?

  • O que é um índice agrupado?

  • O SQL Server não deveria oferecer suporte a RANGE?

  • O que é SQL Server "Denali"? O que há de novo?

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