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 / 48011
Accepted
343
343
Asked: 2013-08-13 16:10:16 +0800 CST2013-08-13 16:10:16 +0800 CST 2013-08-13 16:10:16 +0800 CST

Como particionar uma tabela não particionada existente

  • 772

Eu tenho uma tabela existente com dados:

dbo.Test (col1,col2,col3....) ON [PRIMARY]

Eu preciso mudar essa tabela para ser particionada assim:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

Como posso conseguir isso sem descartar e recriar a tabela?

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 70785 Views

2 respostas

  • Voted
  1. Sebastian Meine
    2013-08-13T18:10:29+08:002013-08-13T18:10:29+08:00

    Você não especifica se sua tabela tem um índice clusterizado ou não, então vamos percorrer todas as opções.

    Vou usar esta função de partição de exemplo, esquema de partição e tabela:

    CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
    GO
    CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
    GO
    CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
    GO
    

    1. Sua tabela possui um índice clusterizado que não foi criado por uma restrição.

    Este é o caso mais fácil. Você pode simplesmente usar a CREATE INDEXinstrução com a DROP_EXISTINGcláusula para mover a tabela para o esquema de partição.

    Suponha para o exemplo que este índice clusterizado tenha sido criado:

    CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];
    

    Para particionar esta tabela, o índice clusterizado inclui a coluna de partição (pt no nosso caso) como parte da chave. Essa instrução altera o índice clusterizado para incluir a coluna de partição e a particiona ao mesmo tempo:

    CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
    

    A DROP_Existingcláusula remove automaticamente o índice existente antes de criar o novo. Isso é preferível a um separado DROP INDEX, pois faz com que os índices não clusterizados sejam reconstruídos apenas uma vez.

    2. Sua tabela tem um índice clusterizado que faz parte de uma restrição PRIMARY KEYou UNIQUEe contém a coluna de partição como parte da chave

    Este ainda é fácil e muito semelhante ao anterior.

    Suponha que essa PRIMARY KEYrestrição tenha sido criada na tabela:

    ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];
    

    Agora você pode simplesmente executar o mesmo script de recriação que usamos em 1:

    CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
    

    3. A tabela tem um índice clusterizado que não inclui a coluna de partição, mas foi criado como parte de uma restrição PRIMARY KEYouUNIQUE

    Azar. Você não pode alterar a definição de a PRIMARY KEYou UNIQUErestrição após o fato. Sua única opção é descartar a restrição e recriá-la incluindo a coluna de partição ou criar um índice clusterizado independente da restrição que inclui a coluna de partição. No segundo caso, você pode recriar a restrição NONCLUSTEREDsem incluir a coluna de partição. Como agora essa restrição não está alinhada (o que significa que seu índice de suporte não é particionado), você precisa especificar onde colocá-la no disco.

    Suponha que a tabela tenha uma chave primária como esta:

    ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];
    

    Para particionar esta tabela, você deve primeiro eliminar a restrição:

    ALTER TABLE dbo.pt DROP CONSTRAINT ptc;
    

    Em seguida, você precisa criar o índice clusterizado particionado:

    CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
    

    Se você optar por recriar a PRIMARY KEYrestrição não alinhada, poderá fazê-lo assim:

    ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];
    

    4. Sua tabela não possui um índice clusterizado

    Neste caso é recomendado na maioria dos casos apenas criar um índice clusterizado para estabelecer o particionamento. Você pode usar a instrução create index vista anteriormente para isso:

    CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
    

    No entanto, se você tiver um bom motivo para não criar um índice clusterizado, poderá se safar com a seguinte abordagem de duas etapas. Infelizmente, não há uma maneira direta de fazer essa mudança.

    Suponha que sua tabela não tenha um índice clusterizado. Para particionar a tabela, você precisa primeiro criar uma CLUSTERED UNIQUErestrição. (Você também pode usar uma CLUSTERED PRIMARY KEYrestrição). Se você tiver uma combinação de colunas exclusiva, essa é uma etapa simples:

    ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);
    

    Depois que a restrição for criada, você pode soltá-la novamente e "mover" a tabela para o novo esquema de partição ao mesmo tempo:

    ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));
    

    Se você não tiver uma combinação de colunas que seja única, você está sem sorte. Nesse caso, sua única opção é adicionar uma nova coluna e preenchê-la com valores exclusivos. Se a tabela for razoavelmente pequena, você pode fazer algo assim:

    ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);
    

    No entanto, isso exigirá um bloqueio de tabela exclusivo até que todas as linhas sejam avaliadas. Dependendo do tamanho da mesa isso pode ser por um bom tempo. Depois que essa coluna for criada, siga as duas etapas acima para primeiro criar a UNIQUErestrição e depois soltá-la novamente imediatamente. Depois, você também pode soltar a coluna novamente. Todas essas etapas são bastante intrusivas, então provavelmente é melhor criar apenas um índice clusterizado na tabela. Isso nem precisa ser único.


    Se você tiver o Enterprise Edition, poderá usar a WITH(ONLINE=ON)cláusula na maioria das declarações acima. Isso manterá sua mesa disponível para outras conexões. No entanto, haverá um impacto no desempenho durante esse período.

    • 57
  2. Best Answer
    Kin Shah
    2013-08-13T16:39:33+08:002013-08-13T16:39:33+08:00

    Para particionar uma tabela, você pode seguir os breves passos abaixo:

    • primeiro crie uma função de partição e um esquema de partição
    • Depois disso, você pode particionar uma tabela.
    • SE sua tabela tiver um índice clusterizado, você precisará eliminá-lo e recriá-lo na partição correta ou poderá usar DROP_EXISTINGa cláusula para recriar o índice clusterizado.
    • Se sua tabela não tiver um índice clusterizado, basta criar um na partição correta usando o esquema de partição.
    • Além disso , o Enterprise Edition tem a flexibilidade de usar a ONLINE=ONopção da instrução CREATE INDEX para minimizar qualquer tempo de inatividade para seu aplicativo. Observe que você verá uma degradação de desempenho enquanto o índice estiver sendo reconstruído usando a opção ONLINE.

    PARA automatizar o particionamento, você também pode usar o utilitário SQL Server Partition Management ou o SQL Server Partitioned Table Framework disponível no codeplex.

    Alguns bons recursos:

    • Criar tabelas e índices particionados
    • Particionamento de tabela do SQL Server: recursos
    • Dicas de particionamento
    • SQL SERVER – 2005 – Tutorial de particionamento de tabela de banco de dados – Como particionar horizontalmente uma tabela de banco de dados
    • 25

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

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