如何使用 SQL Server 2014 中的位字段创建分区

Fou*_*der 6 sql-server partitioning sql-server-2014

我有一个表,其中数据已存档。我需要保留这些数据,因为它很少被查看。

我想在存档字段上创建一个分区,而不是将存档数据移动到单独的表中。当我使用设计器进行分区时,值看起来都错了。

该表目前有 42387343 行(29518148 已归档,12869195 活动),但这将迅速增加。

我正在使用聚集列存储索引

可以/应该/如何在位域上进行分区?

我使用了这个脚本,但它使查询速度变慢了:

BEGIN TRANSACTION
CREATE PARTITION FUNCTION [Archived](bit) AS RANGE LEFT FOR VALUES (N'0', N'1')

CREATE PARTITION SCHEME [Archived] AS PARTITION [Archived] TO ([PRIMARY], [PRIMARY],     [PRIMARY])

DROP INDEX [IX_AttributeDataLog] ON [dbo].[AttributeDataLog] WITH ( ONLINE = OFF )

CREATE CLUSTERED INDEX [ClusteredIndex_on_Archived_635544995752812167] ON [dbo].[AttributeDataLog]
(
[Archivable]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [Archived]([Archivable])

DROP INDEX [ClusteredIndex_on_Archived_635544995752812167] ON [dbo].[AttributeDataLog]

CREATE CLUSTERED COLUMNSTORE INDEX [IX_AttributeDataLog] ON [dbo].[AttributeDataLog]
 WITH (DROP_EXISTING = OFF, DATA_COMPRESSION = COLUMNSTORE) ON [Archived]([Archivable])

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

每个查询都将包含 IsArchived 字段(运行以设置 IsArchived 的查询和一些很少使用的历史报告除外)。我通常会将它放在自己的表中,但是有一些更改可以将存档数据设置为非存档。这些变化随时可能发生。

Pau*_*ite 10

要消除分区,您的查询需要明确bit数据类型,例如:

...WHERE Archivable = CONVERT(bit, 0)
-- NOT
...WHERE Archivable = 0
Run Code Online (Sandbox Code Playgroud)

没有这个,隐式转换中的截断风险意味着不应用分区消除

CREATE PARTITION FUNCTION语句中的隐式转换不是影响因素,因为 SQL Server 会在bit创建函数时为您进行一次转换。尽管如此,编写以下内容会更好/更好:

CREATE PARTITION FUNCTION [Archived](bit) 
AS RANGE LEFT 
FOR VALUES
(
    CONVERT(bit, 0), 
    CONVERT(bit, 1)
);
Run Code Online (Sandbox Code Playgroud)

通过将Archivedinteger改为an来避免这些潜在问题可能更容易,并带有CHECK强制执行允许值的约束。