我是分区的新手,所以我一直在阅读它,以了解它以及如何实现它。我们有一个预计会很大的表,因此DBA建议我们对其进行分区。决定我们将表按月的天划分。因此,我为每月的每一天创建了文件和文件组。然后,我运行以下脚本来创建分区函数:
CREATE PARTITION FUNCTION pfPartitionFunction (INT)
AS
RANGE LEFT FOR VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31)
然后我运行以下脚本来创建分区方案:
CREATE PARTITION SCHEME psPartitionScheme
AS
PARTITION pfPartitionFunction TO (FG1, FG2, FG3, FG4, FG5, FG6, FG7, FG8, FG9, FG10, FG11, FG12, FG13, FG14, FG15, FG16, FG17, FG18, FG19, FG20, FG21, FG22, FG23, FG24, FG25, FG26, FG27, FG28, FG29, FG30, FG31, [PRIMARY])
然后,我尝试用计算列创建表,该计算列将保留创建的日期列的月份日期,并且还将用作分区列:
CREATE TABLE [dbo].[PartitionedTable](
[Id] [varchar](255) NOT NULL,
.
.
.
[CreatedDate] [datetime] NOT NULL,
[CreatedDay] AS DAY(CreatedDate) PERSISTED,
CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON psPartitionScheme([CreatedDay])
) ON psPartitionScheme([CreatedDay])
但是我收到以下错误消息:“列'CreatedDay'是索引'PK_ID'的分区列。唯一索引的分区列必须是索引键的子集。”我不能将计算列作为主键的一部分,因为我们必须确保ID是唯一的。因此,我为主键指定了[PRIMARY],而不是psPartitionScheme。当我运行该程序时,收到以下消息:“为聚集索引'PK_ID'指定的文件组'PRIMARY'用于表'dbo.PartitionedTable',即使为其指定了分区方案'psPartitionScheme'。”当我运行以下查询来检查分区时:
SELECT * FROM sys.partitions
WHERE OBJECT_NAME([object_id]) = 'PartitionedTable'
我桌上还有另外两个索引。当我在分区方案上创建那些表索引时,在sys.partitions表中看到每个分区的31个分区。这样看来可行。但是因为该表未分区,所以我无法利用分区切换,这是此表的另一个要求。当我运行分区切换脚本时:
ALTER TABLE PartitionedTable
SWITCH PARTITION 3
TO PartitionedTableArchive PARTITION 3
我收到以下警告:“表'MyDatabase.dbo.PartitionedTable'的指定分区3在ALTER TABLE SWITCH语句中被忽略,因为该表未分区。”
我还收到以下错误:“'ALTER TABLE SWITCH'语句失败。索引'IX'已分区,而表'MyDatabase.dbo.PartitionedTable'未分区。”
在不将计算所得的列作为主键的一部分的情况下,还有其他方法可以正确地对表进行分区吗?