0

また、このクエリを高速化するための助けが必要です。LIVE データベースで 25 分、TEST データベースで 1 秒かかります。

これはいくつかの変更の後です。元々、メインクエリの各行に対してwhileループを使用してphpページからデータを取得するためにdbサーバーに数百回クエリを実行していたので、一時テーブルを使用してデータを返す手順を作成しようとしました、45分後に実行をキャンセルしました。それで、私はこれを試しました。

「NurQueryResults から上位 1 を選択」クエリで内部結合を実行できると思いますが、それを理解できませんでした。結果は得られましたが、一番上に最新ではありませんでした。「t1.time、t2.time、t3.time ....で注文」しましたが、一番上にt1の最新の結果があり、より多くの結果が返されました必要以上に。

SELECT o.VisitID                                          AS VisitID,
       (SELECT TOP 1 Response
        FROM   NurQueryResults
        WHERE  QueryID = 'OEDTCAT'
               AND VisitID = o.VisitID
        ORDER  BY DateTime DESC)                          AS PPN,
       (SELECT TOP 1 Response
        FROM   NurQueryResults
        WHERE  QueryID = 'OEDTMEAT'
               AND VisitID = o.VisitID
        ORDER  BY DateTime DESC)                          AS MEAT,
       (SELECT TOP 1 Response
        FROM   OeOrderQueries
        WHERE  QueryID = 'OESPMOD'
               AND VisitID = o.VisitID
        ORDER  BY RowUpdateDateTime DESC)                 AS SPMOD,
       (SELECT TOP 1 Response
        FROM   OeOrderQueries
        WHERE  QueryID = 'OERT3'
               AND VisitID = o.VisitID
        ORDER  BY RowUpdateDateTime DESC)                 AS SPMOD2,
       (SELECT TOP 1 Response
        FROM   NurQueryResults
        WHERE  QueryID = 'OEDTDECUB'
               AND VisitID = o.VisitID
        ORDER  BY DateTime DESC)                          AS DECUB,
       (SELECT TOP 1 Response
        FROM   NurQueryResults
        WHERE  QueryID = 'OEALL2'
               AND VisitID = o.VisitID
        ORDER  BY DateTime DESC)                          AS FOODALL,
       o.OrderedProcedureName,
       o.OrderDateTime,
       a.RoomID,
       a.BedID,
       a.Name,
       a.Sex,
       DATEDIFF(year, a.ComputedBirthDateTime, GETDATE()) AS Age
FROM   OeOrders o
       INNER JOIN AdmVisits a
         ON o.VisitID = a.VisitID
            AND o.Category = 'DIET'
            AND o.StatusChoice = 'S'
            AND a.Status = 'ADM IN'
ORDER  BY o.VisitID,
          o.OrderDateTime DESC 
4

2 に答える 2

0

私はちょうど疑問に思っています、あなたがこのようなことをしたときの結果はどうなるでしょうか:

SELECT
    o.VisitID AS VisitID,
    PPN.Response
FROM OeOrders o
JOIN AdmVisits a
    ON o.VisitID = a.VisitID
    AND o.Category = 'DIET'
    AND o.StatusChoice = 'S'
    AND a.Status = 'ADM IN'
join
(
    SELECT 
        Response, 
        VisitID, 
        ROW_NUMBER() OVER(ORDER BY DateTime DESC) AS MyRowNumber 
    FROM NurQueryResults 
    WHERE QueryID = 'OEDTCAT'
) AS PPN
    on o.VisitID = PPN.VisitID
    and PPN.MyRowNumber = 1

これはクエリ全体ではなく、列PPNを取得する最初のサブクエリです。

このJOINのようにすべてのサブクエリを変更した場合、パフォーマンスは向上しますか?

于 2012-11-16T14:59:52.880 に答える
0

実行計画をオンにして、結果を確認します。インデックスまたはその性質の何かが欠落していることを示している可能性があります。インデックスといえば、関連するインデックスの断片化をチェックし、それらが高い場合はそれらを再構築することを検討してください。上記のプロセスに従って、本番環境で実行するのに2分かかった手順を1〜3秒で実行することに、最近かなりの成功を収めました。

于 2012-11-30T23:48:31.393 に答える