Hug*_*rte 5 sql t-sql sql-server sql-server-2008 database-partitioning
我跟着这篇文章: http://www.mssqltips.com/sqlservertip/1796/creating-a-table-with-horizontal-partitioning-in-sql-server/ 这在本质上执行以下操作:
我想执行这样的查询(请原谅我的伪代码)
select * from SalesArchival
where data in filegroup('A')
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者如果没有,我该怎么做呢.
我想要完成的是每天运行批量运行,将超过90天的数据移动到不同的文件组,并仅在"当前"文件组上执行我的前端查询.
为了获取特定的文件组,您总是希望在谓词中利用分区消除来确保读取最少的记录。如果您想从分区中获得任何好处,这一点非常重要。
对于存档,我认为您正在寻找如何拆分和合并范围。您应该始终将第一个和最后一个分区保持为空,但这应该让您了解如何使用分区进行归档。仅供参考,将数据从一个文件组移动到另一个文件组非常耗费资源。此外,如果您使用右范围 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)
Run Code Online (Sandbox Code Playgroud)
检查与每条记录关联的文件组:
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.valueRun Code Online (Sandbox Code Playgroud)
这证明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');Run Code Online (Sandbox Code Playgroud)
重新运行文件组查询以验证 2012-02-06 是否已移至 FG1。
| 归档时间: |
|
| 查看次数: |
8678 次 |
| 最近记录: |