Eu tenho uma tabela existente no grupo de arquivos primário, que desejo particionar. A chave de partição está no ano, que é uma coluna calculada. Eu quero particionar a tabela de tal forma que, no final, os dados de cada ano estejam em seu próprio grupo de arquivos. Eu primeiro quero dividir por 2 anos, para depois testar um pouco mais sobre como dividir os outros dados com o comando split. Agora, posso criar a função e o esquema de partição e também vejo que os dados de um determinado ano estão na partição correta, mas não consigo obter os dados físicos nos grupos de arquivos corretos. Parece que os dados ainda residem nesse grupo de arquivos primário. Tentei reconstruir o índice, mas isso ainda não move os dados no grupo de arquivos correto. No final, a tabela terá um índice columnstore clusterizado, mas também tentei com um índice rowstore clusterizado. O motivo pelo qual fiz isso é porque o SQL Server não parece permitir que um índice columnstore divida e mescle partições não vazias (tentei algumas coisas com divisão e mesclagem, mas o mesmo resultado), então pensei que isso pelo menos funcionaria. Por favor, preencha-me sobre isso se você tiver quaisquer sugestões ou comentários. Estou usando o SQL Server 2019 a propósito.
Agora para o código, eu uso o banco de dados Stackoverflow2013:
use StackOverflow2013;
go
-- Create file groups for partitions
alter database [StackOverflow2013]
add filegroup StackOverflow2013_2008;
ALTER DATABASE [StackOverflow2013]
ADD FILE
(
NAME = [StackOverflow2013_2008],
FILENAME = 'E:\DATA\StackOverflow2013_2008.ndf',
SIZE = 1024 KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512 MB
) TO FILEGROUP [StackOverflow2013_2008]
alter database [StackOverflow2013]
add filegroup StackOverflow2013_2009;
ALTER DATABASE [StackOverflow2013]
ADD FILE
(
NAME = [StackOverflow2013_2009],
FILENAME = 'E:\DATA\StackOverflow2013_2009.ndf',
SIZE = 1024 KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512 MB
) TO FILEGROUP [StackOverflow2013_2009]
-- Drop the current default index, we want to build one later on the partition key
ALTER TABLE [dbo].[Comments] DROP CONSTRAINT [PK_Comments_Id] WITH ( ONLINE = OFF )
-- Add partition key column
alter table [StackOverflow2013].[dbo].[Comments]
add [year] as (datepart(year, CreationDate));
go
-- Add partition function based on year
-- For now we only want 2008 and 2009, other years will be migrated later to test with split function
create partition function fun_Comments(int)
as range left for values (2008, 2009);
-- Add partition scheme
create partition scheme scheme_Comments
as partition fun_Comments
to (StackOverflow2013_2008, StackOverflow2013_2009, [Primary]);
-- Check the partition numbers and who's next
SELECT DestinationId = DestinationDataSpaces.destination_id
,FilegroupName = Filegroups.name
,PartitionHighBoundaryValue = PartitionRangeValues.value
,IsNextUsed = CASE
WHEN DestinationDataSpaces.destination_id > 1
AND LAG(PartitionRangeValues.value, 1) OVER (
ORDER BY DestinationDataSpaces.destination_id ASC
) IS NULL
THEN 1
ELSE 0
END
FROM sys.partition_schemes AS PartitionSchemes
INNER JOIN sys.destination_data_spaces AS DestinationDataSpaces ON PartitionSchemes.data_space_id = DestinationDataSpaces.partition_scheme_id
INNER JOIN sys.filegroups AS Filegroups ON DestinationDataSpaces.data_space_id = Filegroups.data_space_id
LEFT OUTER JOIN sys.partition_range_values AS PartitionRangeValues ON PartitionSchemes.function_id = PartitionRangeValues.function_id
AND DestinationDataSpaces.destination_id = PartitionRangeValues.boundary_id
WHERE PartitionSchemes.name = N'scheme_Comments'
ORDER BY DestinationId ASC;
Verifique as linhas da partição 1
SELECT * FROM Comments
WHERE $PARTITION.fun_Comments(year) = 1;
Verifique as linhas da partição 2
SELECT * FROM Comments
WHERE $PARTITION.fun_Comments(year) = 2;
Verifique os tamanhos dos arquivos
(consulta muito grande)
-- Cria um novo índice clusterizado para distribuir corretamente os dados
create clustered index [CCIX_Comments] ON [dbo].[Comments] (year)
Verifique os tamanhos dos arquivos novamente
Portanto, parece-me que todos os dados ainda estão no grupo de arquivos primário, porque os novos grupos de arquivos estão vazios. A tabela tem 7 GB, então eu esperaria pelo menos que alguns dados estivessem lá.
Então, basicamente, minha pergunta é: como redistribuir corretamente os dados pelos arquivos nos grupos de arquivos neste cenário?
sua instrução create index precisa da cláusula ON para usar o esquema de partição que você criou: