我有一个相当直接的查询,它永远需要运行-返回的每行大约需要一秒钟。问题在于分区方法的等级,但是我不确定如何重写它(交叉应用?)
任何指针将不胜感激。
查询:
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
答案 0 :(得分:0)
rank()
看起来很慢的唯一原因是所有数据需要进行处理才能返回结果。
如果在没有rank()
的情况下运行查询,它将看起来很快-因为返回前几个结果比整个结果集更快。您可以通过将其设为子查询并使用count(*)
来查看效果。
还:学习使用正确的,明确的,标准 JOIN
语法。 从不在FROM
子句中使用逗号。