sql-server - SQL Server 表分区基于模函数?

标签 sql-server sql-server-2005

我有一个非常大的表(10+ 百万行),它开始显示查询性能下降的迹象。由于该表的大小可能很快就会增加一倍或三倍,因此我正在考虑对表进行分区以挤出一些查询性能。

表格看起来像这样:

CREATE TABLE [my_data] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [topic_id] [int] NULL,
    [data_value] [decimal](19, 5) NULL
)

因此,任何给定主题的一堆值。对该表的查询将始终按主题 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

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

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

最佳答案

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

Blue Peter 风格,这是我之前制作的一个(尽管我不能 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

关于sql-server - SQL Server 表分区基于模函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178910/

相关文章:

sql - REPLACE INTO 查询是好的做法吗?

sql-server-2005 - 将内容放入SQL Server 2005中的日期范围

php - SQLSTATE[01002] 仅在 PHP 上的 Adaptive Server 连接失败,我可以通过 CLI 连接

对部分列数据进行 SQL 联接 (SQL Server)

c# - SQL - 左连接上没有空值

sql-server-2005 - SQL Server 报告服务 : creating a Pareto chart

sql - IN 与 JOIN 大行集

sql-server - SQL Server 2005 的测试优先开发工具?

sql-server - 我可以在本地安装并运行SQL Server来免费合法开发吗?

SQL 使用 IF 条件的列值