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)
通过将Archived列integer改为an来避免这些潜在问题可能更容易,并带有CHECK强制执行允许值的约束。
| 归档时间: |
|
| 查看次数: |
1788 次 |
| 最近记录: |