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 / 343577
Accepted
Saran
Saran
Asked: 2024-11-13 18:15:58 +0800 CST2024-11-13 18:15:58 +0800 CST 2024-11-13 18:15:58 +0800 CST

Truncar partição e mesclá-la SQL server

  • 772

Esta postagem dá continuidade à sugestão de design de partição de tabela .

Tentei truncar a partição mais antiga e mesclá-la. Mas estou recebendo um erro "Número de partição inválido 8 especificado para a tabela 'dbo.STYTOTAL_RAW', o número da partição pode variar de 1 a 6." Parece que, depois de mesclar, o loop while está ficando inválido para o número máximo de partição.

Para testes, usei 3 dias, mas o requisito original é excluir a partição com mais de 90 dias.

Conforme @DanGuzman adicionando PF também. O script completo está disponível. no meu primeiro post. Eu também coloquei o link no topo deste post.

--Create function, copy from your script
CREATE PARTITION FUNCTION PF_myDateRange ( [datetime2](7))
AS RANGE RIGHT FOR VALUES 
(
'2024-06-01 23:59:59.9999999',
'2024-07-01 23:59:59.9999999',
'2024-08-01 23:59:59.9999999',
'2024-09-01 23:59:59.9999999',
'2024-10-01 23:59:59.9999999',
'2024-10-21 23:59:59.9999999' -- take the max day and round with 12 AM ex: 2024-10-21 00:00:00.0000000
)
GO
use DB_Partition

--Invalid partition number 8 specified for table 'dbo.STYTOTAL_RAW', partition number can range from 1 to 6.

-- We can loop through the partition number directly from the table
--TRUNCATE TABLE [STYTOTAL_RAW] WITH (PARTITIONS (4));

declare @cmd_1 nvarchar(max)
declare @cmd_2 nvarchar(max)
DECLARE @partition_no bigint
DECLARE @PartitionFunction_name nvarchar(128)
DECLARE @PartitionFunction_Upper_value datetime2(7)
DECLARE @minrow int
DECLARE @maxrow int


select  @minrow = MIN(p.partition_number), @maxrow  = MAX(p.partition_number)
    from sys.indexes i  
    join sys.partitions p ON i.object_id=p.object_id AND i.index_id=p.index_id  
    join sys.partition_schemes ps on ps.data_space_id = i.data_space_id  
    join sys.partition_functions pf on pf.function_id = ps.function_id  
    left join sys.partition_range_values rv on rv.function_id = pf.function_id AND rv.boundary_id = p.partition_number
    join sys.allocation_units au  ON au.container_id = p.hobt_id   
    join sys.filegroups fg  ON fg.data_space_id = au.data_space_id  
    where i.object_id = object_id('STYTOTAL_RAW') 
    and rv.value < DATEADD(DAY, -3, SYSDATETIME()) 
    

select @minrow,@maxrow


while (@minrow <=@maxrow)
 begin

select  @partition_no=partition_number,@PartitionFunction_name=pf.name,@PartitionFunction_Upper_value=cast(rv.value as datetime2(7))
    from sys.indexes i  
    join sys.partitions p ON i.object_id=p.object_id AND i.index_id=p.index_id  
    join sys.partition_schemes ps on ps.data_space_id = i.data_space_id  
    join sys.partition_functions pf on pf.function_id = ps.function_id  
    left join sys.partition_range_values rv on rv.function_id = pf.function_id AND rv.boundary_id = p.partition_number
    join sys.allocation_units au  ON au.container_id = p.hobt_id   
    join sys.filegroups fg  ON fg.data_space_id = au.data_space_id  
    where i.object_id = object_id('STYTOTAL_RAW') 
    and rv.value < DATEADD(DAY, -3, SYSDATETIME()) 
    and p.partition_number = @minrow



SET @cmd_1 = N'TRUNCATE TABLE dbo.STYTOTAL_RAW WITH (PARTITIONS (' + convert(NVARCHAR(128),@partition_no) + N'));'
print @cmd_1
--EXEC sys.sp_executesql @cmd_1
SET @cmd_2 = N'ALTER PARTITION FUNCTION ['+ @PartitionFunction_name+ '] () merge range ('''+convert (NVARCHAR(128), @PartitionFunction_Upper_value) +''');'


print @cmd_2
--EXEC sys.sp_executesql @cmd_2

set @minrow =@minrow +1 
end

Qualquer sugestão, por favor. Obrigado pela ajuda.

sql-server
  • 1 1 respostas
  • 56 Views

1 respostas

  • Voted
  1. Best Answer
    Charlieface
    2024-11-13T19:32:29+08:002024-11-13T19:32:29+08:00

    Se você estiver mesclando diretamente a partir dos números de partição mais baixos, essas partições desaparecerão conforme você fizer o loop.

    Provavelmente faz mais sentido apenas recalcular o número da partição a cada vez e interromper quando não obtiver nenhum resultado.

    declare @cmd nvarchar(max);
    DECLARE @partition_no bigint;
    DECLARE @PartitionFunction_name nvarchar(128);
    DECLARE @PartitionFunction_Upper_value datetime2(7);
    
    while 1=1
    begin
    
        select top (1)
          @partition_no = p.partition_number,
          @PartitionFunction_name = pf.name,
          @PartitionFunction_Upper_value = try_cast(rv.value as datetime2(7))
        from sys.indexes i  
        join sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id  
        join sys.partition_schemes ps on ps.data_space_id = i.data_space_id  
        join sys.partition_functions pf on pf.function_id = ps.function_id  
        join sys.partition_range_values rv on rv.function_id = pf.function_id AND rv.boundary_id = p.partition_number
        where i.object_id = object_id('STYTOTAL_RAW') 
          and try_cast(rv.value as datetime2(7)) < DATEADD(DAY, -3, SYSDATETIME()) 
        order by partition_number desc;
    
        if @@ROWCOUNT = 0
            break;
    
    
        SET @cmd = N'TRUNCATE TABLE dbo.STYTOTAL_RAW WITH (PARTITIONS (' + convert(NVARCHAR(128), @partition_no) + N'));';
        print @cmd;
        EXEC sys.sp_executesql @cmd;
    
        SET @cmd = N'ALTER PARTITION FUNCTION '+ QUOTENAME(@PartitionFunction_name) + ' () merge range (''' + convert (NVARCHAR(128), @PartitionFunction_Upper_value) + ''');';
        print @cmd;
        EXEC sys.sp_executesql @cmd;
    
    end;
    

    db<>violino

    • 1

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

    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