我正在尝试优化我的 SQL 查询,我总是回到这个问题,我希望能深入了解如何最好地优化它。
为简洁起见,假设我有一个简单的员工表:
tbl_employees
Id HiredDateTime
------------------
1 ...
2 ...
这在另一个表中为每个员工提供了版本信息:
tbl_emplyees_versioned
Id Version Name HourlyWage
-------------------------------
1 1 Bob 10
1 2 Bob 20
1 3 Bob 30
2 1 Dan 10
2 2 Dan 20
这就是在视图中检索最新版本记录的方式:
Select tbl_employees.Id, employees_LatestVersion.Name, employees_LatestVersion.HourlyWage, employees_LatestVersion.Version
From tbl_employees
Inner Join tbl_employees_versioned
ON tbl_employees.Id = tbl_employees_versioned.Id
CROSS APPLY
(SELECT Id, Max(Version) AS Version
FROM tbl_employees_versioned AS employees_LatestVersion
WHERE Id = tbl_employees_versioned.Id
GROUP BY Id) AS employees_LatestVersion
要得到这样的回应:
Id Version Name HourlyWage
-------------------------------
1 3 Bob 30
2 2 Dan 20
当提取一个包含超过 500 条员工记录且每个都有几个版本的查询时,此查询开始阻塞并需要几秒钟才能运行。
马上就有几次罢工,但我不知道如何克服它们。
显然,交叉应用增加了一些性能损失。在处理这样的版本信息时是否有最佳实践?有没有更好的方法来获得最高版本的记录?
版本化表没有聚集索引,因为 Id 或 Version 都不是唯一的。将它们连接在一起,但它不会那样工作。相反,Id 有一个非聚集索引,Version 有另一个索引。有没有更好的方法来索引这个表以获得任何性能提升?索引视图在这里真的有帮助吗?