特定のファイルグループを取得するには、述語でパーティションの削除を常に利用して、最小限のレコードが確実に読み取られるようにする必要があります。パーティショニングから利益を得るには、これは非常に重要です。
アーカイブについては、範囲を分割してマージする方法を探していると思います。最初と最後のパーティションは常に空にしておく必要がありますが、これにより、アーカイブにパーティションを使用する方法がわかります。参考までに、あるファイルグループから別のファイルグループにデータを移動することは、非常に多くのリソースを消費します。さらに、範囲右pfを使用すると、結果がわずかに異なります。パーティショニングを行っているので、ベストプラクティスをよく読んでください。
本番環境で実行しないでください。これは、学ぶための単なる例です。
この例では、4つのファイルグループ(FG1、FG2、FG3、および[PRIMARY])が定義されていることを前提としています。
IF EXISTS(SELECT NULL FROM sys.tables WHERE name = 'PartitionTest')
DROP TABLE PartitionTest;
IF EXISTS(SELECT NULL FROM sys.partition_schemes WHERE name = 'PS')
DROP PARTITION SCHEME PS;
IF EXISTS(SELECT NULL FROM sys.partition_functions WHERE name = 'PF')
DROP PARTITION FUNCTION PF;
CREATE PARTITION FUNCTION PF (datetime) AS RANGE LEFT FOR VALUES ('2012-02-05', '2012-05-10','2013-01-01');
CREATE PARTITION SCHEME PS AS PARTITION PF TO (FG1,FG2,FG3,[PRIMARY]);
CREATE TABLE PartitionTest( Id int identity(1,1), DT datetime) ON PS(DT);
INSERT PartitionTest (DT)
SELECT '2012-02-05' --FG1
UNION ALL
SELECT '2012-02-06' --FG2(This is the one 90 days old to archive into FG1)
UNION ALL
SELECT '2012-02-07' --FG2
UNION ALL
SELECT '2012-05-05' --FG2 (This represents a record entered recently)
各レコードに関連付けられているファイルグループを確認します。
SELECT O.name TableName, fg.name FileGroup, ps.name PartitionScheme,pf.name PartitionFunction, ISNULL(prv.value,'Undefined') RangeValue,p.rows
FROM sys.objects O
INNER JOIN sys.partitions p on P.object_id = O.object_id
INNER JOIN sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id
INNER JOIN sys.data_spaces ds on i.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes ps on ds.data_space_id = ps.data_space_id
INNER JOIN sys.partition_functions pf on ps.function_id = pf.function_id
LEFT OUTER JOIN sys.partition_range_values prv on prv.function_id = ps.function_id and p.partition_number = prv.boundary_id
INNER JOIN sys.allocation_units au on p.hobt_id = au.container_id
INNER JOIN sys.filegroups fg ON au.data_space_id = fg.data_space_id
WHERE o.name = 'PartitionTest' AND i.type IN (0,1) --Remove nonclustereds. 0 for heap, 1 for BTree
ORDER BY O.name, fg.name, prv.value
これは、2012-02-05がFG1にあり、残りがFG2にあることを証明しています。
アーカイブするためのあなたの最初の本能は、データを移動することです。ただし、パーティション化する場合は、実際にはパーティション関数の範囲の値をスライドさせる必要があります。
それでは、2012-02-06(あなたの場合は90日以上)をFG1に移動しましょう。
--Move 2012-02-06 from FG2 to FG1
ALTER PARTITION SCHEME PS NEXT USED FG1;
ALTER PARTITION FUNCTION PF() SPLIT RANGE ('2012-02-06');
ファイルグループクエリを再実行して、2012-02-06がFG1に移動したことを確認します。