我正在尝试优化我的 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 有另一个索引。有没有更好的方法来索引这个表以获得任何性能提升?索引视图在这里真的有帮助吗?