SQL Server中表分区的方法

时间:2009-06-11 20:51:05

标签: sql-server partitioning

我正在使用的数据库目前超过100 GiB,并承诺在未来一年左右增长更多。我正在尝试设计一个可以与我的数据集一起使用的分区方案,但到目前为止已经失败了。我的问题是针对这个数据库的查询通常会测试这一个大表中多列的值,最终会以不可预测的方式重叠结果集。

每个人(我正在与之合作的DBA)都警告不要有超过一定大小的表格,我已经研究和评估了我遇到的解决方案,但他们似乎都依赖于允许逻辑表的数据特性分区。不幸的是,鉴于我的表结构,我没有看到实现这一目标的方法。

这是我们两个主要表格的结构,以便对此进行透视。

Table: Case
Columns:
Year
Type
Status
UniqueIdentifier
PrimaryKey
etc.

Table: Case_Participant
Columns:
Case.PrimaryKey
LastName
FirstName
SSN
DLN
OtherUniqueIdentifiers

请注意,上面的任何列都可以用作查询参数。

3 个答案:

答案 0 :(得分:5)

而不是猜测,衡量。收集使用情况统计信息(queries run),查看引擎自己的统计信息,如sys.dm_db_index_usage_stats,然后您做出明智的决定:最佳平衡数据大小的分区,并为最常运行的查询提供最佳关联做个好人。当然,你必须妥协。

另外不要忘记partitioning是每个索引(其中'table'=其中一个索引),而不是每个表,所以问题不是分区,而是分区或不分区以及要使用的分区功能。这两个表上的聚簇索引显然是最可能的候选对象(仅对非聚集索引进行分区并且不对聚簇索引进行分区没有多大意义)因此,除非您正在考虑重新设计聚簇密钥,否则问题实际上是为聚簇索引选择的分区函数。

如果我冒昧猜测,我会说对于随时间累积的任何数据(如'带有'年'的'案例'),最自然的分区是sliding window

答案 1 :(得分:0)

如果您没有其他选择,可以按键模块分区分区表的数量。 可以说你要分区到10个表。 您将定义表格:
Case00
Case01
...
Case09

并通过UniqueIdentifier或PrimaryKey模块10对数据进行分区,并将每条记录放在相应的表中(根据您可能需要开始手动分配ID的唯一UniqueIdentifier)。

执行查询时,您需要对所有表运行相同的查询,并使用UNION将结果集合并为单个查询结果。

它不如根据与预期查询对应的某些逻辑分隔对表进行分区,但它最好能达到表的大小限制。

答案 2 :(得分:0)

另一个可能的事情(在分区之前)是你的模型。

您是否在规范化数据库中?是否有进一步的步骤可以通过标准化/去标准化/部分标准化中的不同选择来提高性能?是否有选项可以将数据转换为最适合报告/查询的Kimball风格的维度星型模型?

如果您不打算删除表的分区(滑动窗口,如上所述)或不同地处理不同的分区(您说在查询中可以使用任何列),我不确定您要尝试的是什么摆脱你尚未从索引策略中获得的分区。

我不知道对行有任何表限制。 AFAIK,行数仅受可用存储空间的限制。

相关问题