【问题标题】:SQL Server 2012 - Partitioning an exisiting tableSQL Server 2012 - 对现有表进行分区
【发布时间】:2015-09-02 21:57:03
【问题描述】:

我们正在对现有表进行分区。让我简单介绍一下背景:

问题背景: 从这里得到了一些指导:https://dba.stackexchange.com/questions/48011/how-to-partition-an-existing-non-partitioned-table

它说,

  • 第一步:首先创建分区函数和分区方案
  • 第 2 步和第 3 步不适用于我的情况
  • 第 4 步:如果您的表没有聚集索引,那么您可以使用分区方案在正确的分区上创建一个。

问题:

  • 我已经完成了第 1 步。在执行第 4 步时,是否必须创建聚集索引。如果是,为什么

  • 我有一个表的 datekey 列(INT 数据类型),其中对于一个特定的 datekey(sample-20150825)会有很多行。我打算选择字符“201508”作为分区键,该月的所有记录都应该在该分区中流动。这可以继续吗?如果是这样,请帮助我正确的方向。

非常感谢。拉克什曼。

【问题讨论】:

  • 这不是强制性的。但是,拥有与分区函数对齐的聚集索引会使分区级别的操作更加高效。例如分区切换。
  • 为什么不使用日期类型而不是 Int 作为 dateKey?然后你可以在每月的第一天进行分区。见stackoverflow.com/questions/31924034/…
  • @JulienVavasseur:如前所述,它是一个现有表,不允许“允许”数据类型更改。但是感谢您提供的链接,该链接在其他领域似乎很有帮助。

标签: sql sql-server sql-server-2012


【解决方案1】:

我可能会选择这样的东西。我假设您按递增顺序插入数据键,而不返回或对其进行任何更新。 在此示例中,我假设您最早的日期键是 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 这样按部分数据键进行分区。这就是为什么我按下个月的第一天进行分区的原因。 所有 datekey >= 20150201 和

创建方案:

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 上拆分函数...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多