0

データベースからすべての実行を取得する必要がありますが、この実行にエラーがあるかどうかをマークする必要があります。

3 テーブル:

  • 実行: 実行が含まれます)
  • Runfiles: 実行中に処理されたファイル ID が含まれます
  • メッセージ: エラー、警告などが含まれています...

このクエリをさらに最適化できますか?

SELECT TOP 1000 runid, 
            start, 
            end, 
            userid, 
            CASE 
              WHEN EXISTS(SELECT rf.fk_fileid 
                          FROM   runfiles rf 
                          WHERE  rf.fk_runid = r.runid 
                                 AND EXISTS(SELECT m.messageid 
                                            FROM   messages m 
                                            WHERE  m.fk_fileid = 
                                                   rf.fk_fileid 
                                                   AND m.fk_statusid = 4)) 
            THEN 1 
              ELSE 0 
            END                 AS ContainsError
FROM   runs r 
ORDER  BY start DESC 

テーブル名についてコメントしないでください。この質問のために翻訳されています。

ありがとう!

4

1 に答える 1

0

これを試して:

SELECT TOP 1000
     r.runid
    ,r.start
    ,r.[end]
    ,r.userid
    ,CASE WHEN m.messageid IS NOT NULL THEN 1 ELSE 0 END AS ContainsError
FROM runs r
LEFT JOIN runfiles rf
    ON rf.fk_runid = r.runid
LEFT JOIN [messages] m
    ON m.fk_fileid = rf.fk_fileid
    AND m.fk_statusid = 4
ORDER BY r.start DESC

選択リスト内のすべてが、結果セットの各行に対して実行されます。これは、ステートメント内のネストされたサブクエリがそれらの行CASEごとに実行されていることを意味します。TOP 1000

左結合とCASEステートメントを使用して、主キーが null かどうかを確認すると、ステートメント全体をセットとして評価できます。これは、SQL Server が行うように構築されています。この方法でパフォーマンスが向上するはずです。

于 2013-02-20T23:32:13.933 に答える