您能否在不更改 SQL 模块或表定义的情况下获得分区消除的性能优势?

Mat*_*tum 5 performance sql-server partitioning physical-design query-performance

我为一家拥有当前不使用数据库分区的多租户数据库模型的公司工作。理想的最终状态是向每个现有表添加一个新的 TenantID 列,包括这个新列作为每个主键中的第一列,并重写所有现有的 SQL 定义以过滤和对 TenantID 进行等联接。

然而,由于现有的 SQL 模块数以千计,这是一个资源密集型解决方案,完全重写整个数据库。所以我的新计划是分阶段进行此更新。

第一阶段将完全保持现有的数据库模式,并创建对齐的数据库分区,这些分区使用现有的供应商 ID 列(几乎在每个表中)作为 TenantID 的代理。供应商 ID 已经很好地符合我想用租户 ID 做的事情。现有供应商聚集成供应商组,因此可以将一组供应商视为单个租户。

所以我的问题是。如果我这样做,在现有表上创建对齐的数据库分区而不更改任何表架构或任何现有 SQL 模块的定义,我会看到任何性能优势吗?

您可以在评论中询问更多信息,我会更新问题以反映它们。但是对于初学者来说,有许多现有的查询会根据供应商 ID 进行过滤,但很少有与之匹配的查询。

Jam*_*son 8

可能,但根据我的经验,您不会出于性能原因对数据进行分区。是的,分区消除可以减少某些查询消耗的 IO,但是分区会带来一些复杂性,请参阅此处了解我的最爱。

分区有助于维护。您可以在分区级别重建索引和统计信息(在 SQL Server 2014+ 上)。当您努力将维护操作保持在维护窗口内时,这可能是一个巨大的胜利。

在加载和归档数据时,分区也很棒。该SWITCH声明是在这里你的朋友。

最后,分区还可用于通过对数据引入排序级别来优化列存储索引。这有助于缓解字典压力。每个分区都充当它自己的列存储索引,这意味着您可以获得更多全局字典以及增量存储和增量位图。Niko 的博客在这里有更多信息