我正在处理具有数千万行的数据库表(随着时间的推移可能会达到数亿),我正在考虑实现数据库分区,以便在行数增加时保持性能稳定。这就是我想做的事情:
说我有一张存放动物的桌子。其中一个领域是AnimalType(即Bird / Fish / Cat / Dog)。我希望每个AnimalType都是一个单独的分区,因为99%的查询只涉及一个AnimalType&表中大致有相同数量的AnimalTypes(即1000条鱼,1000只,1000只狗),这意味着分区应该很好并且均匀分布。但是,很多的动物类型,我不想为每个AnimalType手动创建数百个分区,然后每次输入新的AnimalType时都必须创建一个新的分区。
因此,我想要的是告诉SQL Server基于AnimalType进行分区的一些方法。如果AnimalType已有分区,请使用该分区,否则SQL Server将自动创建新分区。
这听起来很简单,但我似乎找不到办法做到这一点。有可能吗?
或者,还有哪些其他方法可以保持表访问速度的快速和快速?我想避免任何只是手动将内容移动到更多表中的内容,例如将旧记录移动到历史样式表中,因为查询可能需要来自完整数据集的数据,因此实际上不会救命。我已经有了一些有用的基本索引。
答案 0 :(得分:3)
分区是存储问题的解决方案,即。根据某些字段值确定文件组数据的位置。就其本身而言,它没有提供真正的性能优势,实际上它实际上会减慢查询的次数,因为需要添加新的分区位置运算符。强制查询仅考虑一个分区的唯一方法是$PARTITION语法,这不能在实际应用场景中使用。选择仅查找一个分区的查询仅基于索引范围进行查询,并且可以使用或不使用分区扫描完全相同数量的记录。
分区具有性能优势的唯一时间是管理活动,例如分区切换和从表或批量导入操作切换。
性能优势只能来自正确的索引和精心设计的查询。
答案 1 :(得分:0)
这是一个非常古老的问题,因此可能需要一些更新的信息。首先,回答最初的问题,是的,可以通过调度作业的方式进行动态分区:
Marlon Ribunal article, see section on dynamic paritioning
How to automate Table Partitioning in SQL Server by Jignesh Raiyani at SQL Shack
我还想补充一点,分区可以在某些情况下提高查询性能。对我来说,使用聚集列存储索引,我能够利用分区来促进段消除。请参阅 2018 年关于它的 SO 帖子:
Partitioning columnstore tables for performance
不能轻易进入分区方案。在实施之前,应该证明它是额外的复杂性和开销,以增强您的设计。