如何优化/重新思考分区查询排名

时间:2019-10-10 15:31:35

标签: sql sql-server

我有一个相当直接的查询,它永远需要运行-返回的每行大约需要一秒钟。问题在于分区方法的等级,但是我不确定如何重写它(交叉应用?)

任何指针将不胜感激。

查询:

Select orders.orderid
    ,prescriptions.patientid as Rx_PtID
    ,prescriptions.prescriptiontypeid
    ,prescriptions.prescriptionid
    ,letter_history.employeename
    ,RANK() OVER (PARTITION BY prescriptions.prescriptionid ORDER BY letter_history.letter_date ASC) AS orank --Assigns ID based on first printing
from letter_history,orders,prescriptions
where letter_history.description LIKE CONCAT('%', orders.orderid, '%')
    AND prescriptions.patientid = orders.patientid
    AND orders.ordertypeid = 999                    --Exam Orders Only
    AND CONVERT(varchar(10),orders.orderdate, 120) = CONVERT(varchar(10),prescriptions.rxdate, 120)
    AND CAST(orders.ordereddate as date) >= @DateFrom
    AND CAST(orders.ordereddate as date) <= @DateTo

1 个答案:

答案 0 :(得分:0)

rank()看起来很慢的唯一原因是所有数据需要进行处理才能返回结果。

如果在没有rank()的情况下运行查询,它将看起来很快-因为返回前几个结果比整个结果集更快。您可以通过将其设为子查询并使用count(*)来查看效果。

还:学习使用正确的,明确的,标准 JOIN语法。 从不FROM子句中使用逗号。