我们正在对现有表进行分区。让我分享一下背景情况:
问题背景: 这里有一些指导原则:https://dba.stackexchange.com/questions/48011/how-to-partition-an-existing-non-partitioned-table
它说,
问题:
我已经完成了Step1。执行步骤4时,是否必须创建聚簇索引。如果是这样,为什么?
我有一个表的 datekey 列(INT数据类型),它对于一个特定的日期密钥(sample-20150825)有足够的行。我打算选择人物' 201508'作为分区键,该月的所有记录都应该在该分区中流动。这可以继续吗?如果是这样,请帮我正确指示。
非常感谢。拉克什曼。
答案 0 :(得分:2)
我可能会选择这样的东西。我认为你按照交易顺序插入datakey而不返回或更新它。 在此示例中,我假设您最早的日期密钥是在2015年1月。
创建一个没有聚集索引的测试表:
create table dbo.test(id int identity(0, 1) primary key nonclustered, datekey int, data nchar(2000))
go
insert into test(datekey, data) values
(20150125, ''), (20150120, ''), (20150118, ''), (20150118, ''), (20150118, '')
, (20150205, ''), (20150215, ''), (20150215, ''), (20150215, ''), (20150215, '')
, (20150305, ''), (20150315, '')
创建文件组和文件:
Alter Database [Test] Add Filegroup [Part_201501]
Alter Database [Test] Add Filegroup [Part_201502]
Alter Database [Test] Add Filegroup [Part_201503]
Alter Database [Test] Add FILE ( NAME = N'Part_201501', FILENAME = N'...\Part_201501.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201501]
Alter Database [Test] Add FILE ( NAME = N'Part_201502', FILENAME = N'...\Part_201502.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201502]
Alter Database [Test] Add FILE ( NAME = N'Part_201503', FILENAME = N'...\Part_201503.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_201503]
从20150201之前的所有内容开始创建函数(意味着01-2015):
Create Partition Function DateKeyPartFunction (int)
as Range Right For Values (20150201, 20150301)
请注意,我不能像201501那样按部分数据键进行分区。这就是我在下个月的第一天进行分区的原因。 所有日期键> = 20150201和< 20150301将成为Part_201502分区的一部分。
创建方案:
Create Partition Scheme DateKeyPartScheme as Partition DateKeyPartFunction
To ([Part_201501], [Part_201502], [Part_201503])
创建聚集索引:
Create Clustered Index IDX_Part On dbo.Test(datekey) On DateKeyPartScheme(datekey);
如果您有群集主键。您必须用非群集PK替换它(+删除/添加FK)。 这不会改变你的桌子类型。
到达四月后,您只需添加一个新的Part_201504文件组并将该功能拆分为20150401 ......