这是我在这里的第一个问题,所以如果我违反任何规则,我深表歉意。
这是情况。我有一张表格,列出了所有员工和他们被分配到的大楼,加上培训时间,以 ssn 作为 id 列,我有另一个表格列出了公司中的所有员工,也有 ssn,但包括姓名,和其他个人数据。第二个表包含每个员工在不同时间点的多条记录。我需要做的是从某个建筑物中选择第一个表中的所有记录,然后从第二个表中获取最新名称,并允许结果集按返回的任何列排序。
我有这个,它工作正常,只是很慢。
表格的一个非常简化的版本是:
table1 (ssn CHAR(9), buildingNumber CHAR(7), trainingHours(DEC(5,2)) (7200 rows)
table2 (ssn CHAR(9), fName VARCHAR(20), lName VARCHAR(20), sequence INT) (708,000 rows)
表 2 中的序列列是一个数字,对应于输入这些记录的预定日期,数字越大,条目越新。每个员工都有几条记录是常见的/预期的。但有几个可能没有最新的(即'8')。
我的 SProc 是:
@BuildingNumber CHAR(7), @SortField VARCHAR(25)
BEGIN
DECLARE @returnValue TABLE(ssn CHAR(9), buildingNumber CAHR(7), fname VARCHAR(20), lName VARCHAR(20), rowNumber INT)
INSERT INTO @returnValue(...)
SELECT(ssn,buildingNum,fname,lname,rowNum)
FROM SELECT(...,CASE @SortField Row_Number() OVER (PARTITION BY buildingNumber ORDER BY {sortField column} END AS RowNumber)
FROM table1 a
OUTER APPLY(SELECT TOP 1 fName,lName FROM table2 WHERE ssn = a.ssn ORDER BY sequence DESC) AS e
where buildingNumber = @BuildingNumber
SELECT * from @returnValue ORDER BY RowNumber
END
我有以下索引:
table1: buildingNumber(non-unique,nonclustered)
table2: sequence_ssn(unique,nonclustered)
就像我说的那样,这让我得到了正确的结果集,但它相当慢。有没有更好的方法来做到这一点?
无法更改数据库结构或表 2 的运行方式。相信我,如果它会完成。是否有任何索引可以帮助加快速度?
我查看了执行计划,它对表 2 进行了聚集索引扫描(18%),然后是计算标量(0%),然后是急切假脱机(59%),然后是过滤器(0%),然后是前 n 个排序(14%)。这是执行的 78%,所以我知道它在获取名称的部分中,只是不确定更好(更快)的方法。
我问的原因是表 1 需要用当前数据更新。这是通过带有 radgrid 控件的网页完成的。它有一个范围、起始索引等等,而且用户需要永远更新他们的数据。我可以更改更新过程的完成方式,但我想我会先询问查询。
提前致谢。