基于模数函数的SQL Server表分区?

rus*_*sty 5 sql-server sql-server-2005

我有一个非常大的表(超过1000万行),开始显示查询性能下降的迹象.由于这个表的大小可能会相对很快增加一倍或三倍,所以我正在考虑对表进行分区以挤出一些查询性能.

该表看起来像这样:

CREATE TABLE [my_data] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [topic_id] [int] NULL,
    [data_value] [decimal](19, 5) NULL
)
Run Code Online (Sandbox Code Playgroud)

因此,任何给定主题的一堆值.此表上的查询将始终按主题ID,因此在(id,topic_id)上有一个聚簇索引.

无论如何,由于主题ID没有限制(可以添加任意数量的主题),我想尝试在主题ID的模数函数上对此表进行分区.所以类似于:

topic_id % 4 == 0 => partition 0
topic_id % 4 == 1 => partition 1
topic_id % 4 == 2 => partition 2
topic_id % 4 == 3 => partition 3
Run Code Online (Sandbox Code Playgroud)

但是,在决定分区时,我还没有看到任何方法告诉"创建分区函数"或"创建分区方案"来执行此操作.

这甚至可能吗?我们如何根据对输入值执行的操作来创建分区函数?

Mat*_*eld 5

您只需要将模数列创建为PERSISTED计算列.

蓝色彼得风格,这是我之前做的一个(虽然我不是100%确定我有分区值子句):

CREATE PARTITION FUNCTION [PF_PartitonFour] (int)
AS RANGE RIGHT
FOR VALUES (
  0,
  1,
  2)
GO

CREATE PARTITION SCHEME [PS_PartitionFourScheme]
AS PARTITION [PF_PartitonFour]
TO ([TestPartitionGroup1],
    [TestPartitionGroup2],
    [TestPartitionGroup3],
    [TestPartitionGroup4])
GO

CREATE TABLE [my_data] (
  [id] [int] IDENTITY(1,1) NOT NULL,
  [topic_id] [int] NULL,
  [data_value] [decimal](19, 5) NULL
  [PartitionElement] AS [topic_id] % 4 PERSISTED,
) ON [PS_PartitionFourScheme] (PartitionElement);
GO
Run Code Online (Sandbox Code Playgroud)

  • 不,它只是回答被问到的问题,而不是*我认为*应该被问到的问题.另外,有人从谷歌那里发现这个问题并不想找到一大堆讲道,他们会想找到如何基于模数函数对表进行分区,如果我错了,请纠正我,这就是我给出的答案. (3认同)