sql-server - 大型数据库表的 SQL Server 自动分区

标签 sql-server partitioning vldb

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

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

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

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

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

最佳答案

分区是存储问题的解决方案,即。根据某些字段值确定位于哪些文件组数据。就其本身而言,它并没有带来真正的性能优势,事实上,它实际上在大多数时候都会减慢查询速度,因为需要添加新的分区位置运算符。强制查询只考虑一个分区的唯一方法是 $PARTITION语法,这不能在现实世界的应用场景中使用。选择仅查找一个分区的查询仅基于索引范围执行此操作,并且将扫描完全相同数量的记录(无论是否分区)。

分区具有性能优势的唯一时间是管理事件,例如分区切入和切出表或批量导入操作。

性能优势只能来自适当的索引和精心设计的查询。

关于sql-server - 大型数据库表的 SQL Server 自动分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634986/

相关文章:

sql - SQL Server 2012 中基于列的查询加速器

sql-server - SQL Server - 是基于 GUID 的 PK,支持基于租户的水平分区的最佳实践

sql-server - 在 T-SQL 中通过 XQuery 选择时连接 xml 值

c# - 我们如何处理 LINQ to SQL 中的并发错误?

ubuntu - 如何三次启动 Debian/Arch linux/Ubuntu

partitioning - 我们真正可以在 ESP32 中使用多少 NVS 数据?

mysql - mySQL 数据库可以有多个文件来分散 IO 吗?

sql - RBAR 与具有不同事务大小的基于集的处理的性能比较

hadoop - hadoop 之上的列存储?

java - 在执行 Spring boot JUnit 类之前仅运行一次 sql 脚本