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.
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.
db<>violino