小编Mat*_*tum的帖子

SUM(CASE) 或 CTE PIVOT 哪个更快?

有两种类型的方法来执行PIVOT. 在 SQL Server 2005PIVOT推出之前,大多数人都是这样做的:

SELECT RateID
              SUM(CASE WHEN RateItemTypeID = 1 THEN UnitPrice ELSE 0 END),
              SUM(CASE WHEN RateItemTypeID = 2 THEN UnitPrice ELSE 0 END),
              SUM(CASE WHEN RateItemTypeID = 3 THEN UnitPrice ELSE 0 END)
              FROM rate_item WHERE _WhereClause_
              GROUP BY RateID
Run Code Online (Sandbox Code Playgroud)

后来,当 2005 年推出时,PIVOT它变成了这样:

   SELECT RateID, [1], [2], [3]
          FROM PertinentRates -- PertinentRates is a CTE with WHERE clause applied
          PIVOT (SUM(UnitPrice) FOR RateItemTypeID IN ([1], [2], [3])) PVT)
Run Code Online (Sandbox Code Playgroud)

在 SQL …

performance sql-server pivot query-performance

10
推荐指数
4
解决办法
8628
查看次数

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

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

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

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

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

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

performance sql-server partitioning physical-design query-performance

5
推荐指数
1
解决办法
221
查看次数