SQL Server在日期列上的分区

时间:2014-01-06 20:45:30

标签: sql-server partitioning

有2个表,Doc和DocDetail:

CREATE TABLE [Doc](

[ID] [int] IDENTITY(1,1) NOT NULL,
[DocTypeId] [int] NOT NULL,
[BusinessEntityId] [int] NOT NULL,
[Created] [datetime] NOT NULL CONSTRAINT [DF_Doc_Created] DEFAULT (getdate()),
[Updated] [datetime] NULL CONSTRAINT [DF_Doc_Updated] DEFAULT (getdate()),
[Active] [bit] NOT NULL CONSTRAINT [DF_Doc_Active]  DEFAULT ((1)),
[ReadOnly] [bit] NOT NULL CONSTRAINT [DF_Doc_ReadOnly]  DEFAULT ((0)),
CONSTRAINT [PK_Doc] PRIMARY KEY CLUSTERED ([ID] ASC) ) ON [PRIMARY]

 CREATE TABLE [dbo].[DocDetail](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DocId] [int] NOT NULL,
[FieldId] [int] NOT NULL,
[RowNumber] [int] NULL,
[ParentRowNumber] [int] NULL,
[vString] [varchar](4096) NULL,
[vDate] [datetime] NULL,
[vTime] [time] NULL,
[vInteger] [int] NULL,
[vNumber] [decimal](26, 7) NULL,
[vReal] [float] NULL,
 CONSTRAINT [PK_DocDetail] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY]

DocDetail只会填充其中一个vXXX列。其他人将为NULL。

对表的所有访问都是通过一些存储过程和视图。我可以根据需要添加列(例如DocDetail中的一列重复Doc Created日期,通过触发器填充,用于分区),但我无法重写应用程序。

DocDetail已超过十亿行,由于新业务,现在每天新增约900万!过去,数据是通过基于Doc表的Created列将行移动到另一个数据库来“存档”的。随着时间的推移,当行“老化”时,它们会从该数据库中删除。但是,额外的外部要求阻止我们继续这样做,并且数据迅速堆积起来。该服务器具有256GB RAM和一个具有充足存储空间的漂亮SAN(到目前为止)。我有一个不错的测试环境,我一直在玩,以验证我的解决方案。

研究分区。大约45%的OLTP用于在过去30天内创建的数据。从那时起60天内(即,大于30天,小于90天),大约25%的数据是在数据上。剩下的时间超过90天,最多约18个月。我需要保留7年的数据,但它不一定都在这个数据库中。

有关分区方案的任何建议吗?

1 个答案:

答案 0 :(得分:1)

查看我关于有效数据仓库存储模式的SQL PASS的演示文稿。

http://craftydba.com/?page_id=880

该演示文稿回顾了以下技术来解决您的困境。它具有1.2 M行数据库的工作代码。

Coverage:

1 – What is horizontal partitioning?
2 – Database sharding for daily information.
3 – Working with files and file groups.
3 – Partitioned views for performance.
4 – Table and Index partitions.
5 – Row Data Compression.
6 – Page Data Compression.
7 – Programming a sliding window.
8 – What are Federations in Azure SQL?

至于哪条路,取决于你。

分片视图和分区视图都可以使用标准版本的SQL Server完成。

企业版的SQL Server中提供了数据压缩和表分区。

由于您是从头开始构建仓库,因此可以更改数据类型以节省空间。

我能够使用压缩和分区将4 TB数据库重组为500 GB。

总之,DATES和INTEGERS都是分区键的理想选择。

在我自己的仓库中,日期维度将日期映射为整数。

在测试环境中玩游戏,了解真正的重建将如何运作。

祝你好运。