【发布时间】:2013-07-23 05:57:36
【问题描述】:
这是我在这里的第一个问题,如果我违反任何规则,我深表歉意。
情况是这样的。我有一张表格,列出了所有员工和他们被分配到的大楼,加上培训时间,以 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(非唯一,非聚集)
表 2:sequence_ssn(唯一,非集群)
就像我说的那样,这可以让我得到正确的结果集,但它相当慢。有没有更好的方法来做到这一点?
无法更改数据库结构或表 2 的运行方式。相信我,如果它会完成。是否有任何索引可以帮助加快速度?
我查看了执行计划,它对表 2 进行了聚集索引扫描 (18%),然后是计算标量 (0%),然后是急切假脱机 (59%),然后是过滤器 (0 %),然后是前 n 个排序(14%)。 这是执行的 78%,所以我知道它在获取名称的部分中,只是不确定更好(更快)的方法。
我问的原因是表 1 需要使用当前数据进行更新。这是通过带有 radgrid 控件的网页完成的。它有一个范围、起始索引等等,而且用户需要永远更新他们的数据。 我可以更改更新过程的完成方式,但我想我会先询问查询。
提前致谢。
【问题讨论】:
-
我只想加入这两个表并利用排名功能。从那里,只需选择排名列 = 1 的位置。
标签: sql-server