有两种类型的方法来执行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 …
我为一家拥有当前不使用数据库分区的多租户数据库模型的公司工作。理想的最终状态是向每个现有表添加一个新的 TenantID 列,包括这个新列作为每个主键中的第一列,并重写所有现有的 SQL 定义以过滤和对 TenantID 进行等联接。
然而,由于现有的 SQL 模块数以千计,这是一个资源密集型解决方案,完全重写整个数据库。所以我的新计划是分阶段进行此更新。
第一阶段将完全保持现有的数据库模式,并创建对齐的数据库分区,这些分区使用现有的供应商 ID 列(几乎在每个表中)作为 TenantID 的代理。供应商 ID 已经很好地符合我想用租户 ID 做的事情。现有供应商聚集成供应商组,因此可以将一组供应商视为单个租户。
所以我的问题是。如果我这样做,在现有表上创建对齐的数据库分区而不更改任何表架构或任何现有 SQL 模块的定义,我会看到任何性能优势吗?
您可以在评论中询问更多信息,我会更新问题以反映它们。但是对于初学者来说,有许多现有的查询会根据供应商 ID 进行过滤,但很少有与之匹配的查询。
performance sql-server partitioning physical-design query-performance