Как оптимизировать / переосмыслить запрос ранга над разделом - PullRequest
0 голосов
/ 10 октября 2019

У меня довольно простой запрос, выполнение которого занимает вечность - примерно секунда на возвращаемую строку. Проблема заключается в подходе ранжирования по разделам, но я не уверен, как его переписать (перекрестное применение?)

Любые указатели приветствуются.

Запрос:

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 голосов
/ 10 октября 2019

Единственная причина, по которой rank() кажется медленным, состоит в том, что все данные должны быть обработаны для того, чтобы они возвращали результаты.

Если вы выполняете запрос без rank() это будет выглядеть быстро - потому что быстрее вернуть первые несколько результатов, чем весь набор результатов. Вы можете проверить это, сделав этот подзапрос и используя count(*), чтобы увидеть производительность.

Также: Научитесь использовать правильный, явный, стандартный JOIN синтаксис. Никогда не используйте запятые в предложении FROM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...