3

我正在处理具有数千万行的数据库表(随着时间的推移可能会达到数亿行),并且正在考虑实施数据库分区以尝试在行数增加时保持性能稳定。这就是我想做的:

假设我有一张存放动物的桌子。字段之一是AnimalType(即Bird/Fish/Cat/Dog)。我希望每个 AnimalType 都是一个单独的分区,因为 99% 的查询只与一个 AnimalType 相关,并且表中的 AnimalType 数量大致相等(即 1000 条鱼、1000 只鸟、1000 条狗),所以这意味着分区应该很好并且均匀分布。但是,动物类型很多,我不想去手动为每个AnimalType创建数百个分区,然后每次输入一个新的AnimalType都必须创建一个新分区。

因此,我想要的是某种方式告诉 SQL Server 基于 AnimalType 进行分区。如果 AnimalType 已经有一个分区,请使用该分区,否则 SQL Server 将自动创建一个新分区。

这听起来很简单,但我似乎无法找到一种方法来做到这一点。可能吗?

或者,还有哪些其他方法可以保持表访问速度又快又快?我想避免任何只是手动将内容移动到更多表中的事情,例如将旧记录移动到历史样式表中,因为查询可能需要来自完整数据集的数据,因此这实际上不会帮助。我已经有一些基本的索引,它们有很大帮助。

4

2 回答 2

3

Partitioning is a solution for storage problems, ie. determine on what filegroup data is located based on some field value. On its own, it gives no real performance benefit, in fact it actually slows down queries most times because new partition location operators need to be added. The only way to enforce queries to consider only one partition is the $PARTITION syntax, and this cannot be used in real world applications scenarios. Queries that opt to look up only one partition do so solely based on the index ranges, and would scan exactly the same number of records with or without partitioning.

the only time when partitioning has a performance benefit is for administration activities like partition switch in and switch out from a table or bulk import operations.

Performance benefits can come only from proper indexes and carefully designed queries.

于 2009-10-28T05:33:47.200 回答
1

这是一个非常古老的问题,因此可能需要一些更新的信息。首先,要回答最初的问题,是的,可以通过预定作业进行动态分区:

Marlon Ribunal 文章,参见动态分区部分

SQL Shack 上的 Jignesh Rayani 如何在 SQL Server 中自动执行表分区

我还想补充一点,分区可以在某些情况下提高查询性能。对我来说,通过聚集列存储索引,我能够利用分区来促进段消除。请参阅 2018 年关于它的 SO 帖子:

对列存储表进行分区以提高性能

切不可轻易进入分区方案。在实施之前应该证明它是额外的复杂性和开销以增强您的设计。

于 2021-04-01T18:40:57.223 回答