针对非平等数据连接的查询优化

时间:2016-09-02 02:15:13

标签: sql sql-server

表员工:

Empid  STW  --StartWorkTime
------------------------------
1      02:00:00.000
2      03:00:00.000
3      05:30:00.000

表顺序:

Orderid  PlaceTime
-------------------------------
1        02:22:22.333
2        02:33:33:555
3        03:44:44:111
4        05:45:45:545

请求是:将员工按其时间关系放置的订单连接起来,例如:

Empid   Orderid
--------------------
1       1
1       2
2       3
3       4

假设最后一名员工下班时间=当前工作时间。

目前我的解决方案是:

SELECT e.empid, o.orderid
FROM order o
CROSS APPLY
     (SELECT TOP(1) e.empid FROM order e
      WHERE e.STW < o.placetime
      ORDER BY STW DESC) e

当表employee很小(order 1 mil行,employee 50行,大约30秒)时,解决方案正常工作,但随着employee展开,性能会迅速下降(当它行10000次时,需要一个多小时)。是否有任何解决方案来优化这种情况?

1 个答案:

答案 0 :(得分:0)

我首先推荐索引。首先,我会修复查询,以便子查询使用employee表(我假设这是问题中的拼写错误):

SELECT e.empid, o.orderid
FROM order o CROSS APPLY
     (SELECT TOP(1) e.empid
      FROM employee e
      WHERE e.STW < o.placetime
      ORDER BY STW DESC
     ) e;

您需要employee(STW, empid)上的索引。看看这是否有助于查询。