2016-11-16 4 views
-3

以下のクエリには多くの時間がかかりますが、すべての列がインデックスに登録されています。以下のSQLクエリは時間がかかりますが、パフォーマンスを向上させるためにはどのような方法がありますか?

どのように最適化するのですか?

SELECT 
    COUNT(CAST(CA.CORNER_ATTITUDE_ID AS VARCHAR (40))) 
FROM 
    (SELECT * 
    FROM CORNER_ATTITUDE 
    WHERE OWNER_ID = '100' 
     AND CORNER_ATTITUDE_ID NOT IN (SELECT LEGAL_ID 
             FROM CAPTAIN_LOGIC 
             WHERE LEGAL_ID != '12345678' 
             AND OWNER_ID = '100')) CA 
LEFT OUTER JOIN 
    CORNER_ATTITUDE_MEMBER CAC ON (CA.CORNER_ATTITUDE_ID = CAC.CORNER_ATTITUDE_ID) 
JOIN 
    (SELECT * 
    FROM MEMBER 
    WHERE MEMBER_ROLE_ID = 'MEMBER') C ON (CAC.MEMBER_FESTIVEL_ID = C.MEMBER_FESTIVEL_ID) 
LEFT OUTER JOIN 
    VINAYAN P ON (C.MEMBER_FESTIVEL_ID = P.VINAYAN_FESTIVEL_ID) 
LEFT OUTER JOIN 
    VINAYAN_NAME PN ON (P.VINAYAN_FESTIVEL_ID = PN.VINAYAN_FESTIVEL_ID) 
LEFT OUTER JOIN 
    DRA_SERVER OC ON CAST (ca.STAR_0_Numer AS NVARCHAR2 (40)) = OC.SERVER_PID 
LEFT OUTER JOIN 
    (SELECT CORNER_ATTITUDE_ID, PROVIDE_ID 
    FROM STORED_PROVIDE 
    WHERE PROVIDE_ORIGIN_TYPE_CD = 'PROVIDE_ORIGIN_TYPE_DECISION_SERVICE') CF ON (CA.CORNER_ATTITUDE_ID = CF.CORNER_ATTITUDE_ID) 
LEFT OUTER JOIN 
    STORED_DETAIL CD ON CD.PROVIDE_ID = CF.PROVIDE_ID 
LEFT OUTER JOIN 
    STORED_APPL_PRODUCT CAP ON CAP.STORED_DETAIL_ID = CD.STORED_DETAIL_ID 
LEFT OUTER JOIN 
    PRODUCT_TYPE PT ON PT.PRODUCT_TYPE_CD = CAP.PRODUCT_TYPE_CD 
LEFT OUTER JOIN 
    DRA O ON O.GREEN_FESTIVEL_ID = OC.SERVER_FESTIVEL_ID 
WHERE 
    (CA.STAR_0_STRG = 'TRUE' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'A' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'B' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'C' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'D' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'E' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'F' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'G' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'H' 
    AND CD.BORROW_USING_TXT <> 'I' 
    AND CD.BORROW_USING_TXT <> 'J' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'K' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'L' 
    AND CD.BORROW_USING_TXT <> 'M' 
    AND CD.BORROW_USING_TXT <> 'N' 
    AND CD.BORROW_USING_TXT <> 'O' 
    AND CA.CORNER_ATTITUDE_STATUS_CD <> 'P' 
    AND CD.BORROW_USING_TXT <> 'Q') 
    AND OC.SERVER_XID IN (400 Integer values); 
+5

あなたのsqlコードを書式化し、読みやすくして、さらに情報を追加し、正しくタグ付けします。あなたは 'sql-server'と' oracle'を持っているので、1つを選んでください。 – Tanner

+3

パフォーマンス向上のために果物をぶら下げません。 select *は使わず、実際に必要な列だけを選択してください。あなたのwhere述語は非対応です。何よりもこのクエリを整理してフォーマットする必要があります。あなたのエイリアスは、私の眼球を取り出してポップアップしたいと思っています。エイリアスは、それらがどの表を表しているかを示す指標を提供する必要があります。あなたのものは、テーブルの名前とは関係のないランダムな文字のようです。あなたは不平等チェックと矛盾しています。いくつかの場所で!=と他の<>。 –

+3

実際にどのようなメリットを提供するには、使用しているDBMSを決定する必要があります。次に、テーブルのddl(インデックスを含む)を提供する必要があります。すべての列が索引付けされているということは、通常、索引付け方針が良いものではないことを示しています。 –

答えて

0

フォーマットを行わずにクエリを読み取るのは少し難しいです。しかし、いくつかのことを考えるように:CA.STAR_0_STRG以来

  • はブールのようです、あなたが本当にあなたのWHEREでこれらの条件のすべてが必要ですVARCHAR
  • を使用する必要はありませんか?それらを減らすか簡略化できますか?私はCA.CORNER_ATTITUDE_STATUS_CD <> 'K' AND CA.CORNER_ATTITUDE_STATUS_CD <> 'L'のように、同じ分野で11の条件を見る。
  • (最も重要な)最後のWHEREの条件からいくつかの多くのJOINの述語にロジックの一部を移動できますか?あなたが実際に参加しているデータの量を減らすことができれば、多くの助けになります。
+0

はい、どこの条件をすべて使用する必要がありますか?NOT IN()の中にそれらを移動すると便利でしょうか? –

+0

それは確かにそれをより読みやすくするでしょう。しかし、あなたがこれらの条件を 'WHERE'ここに移動した場合、あなたのクエリはもっと​​パフォーマンスが良いでしょう: –

+0

' SELECT COUNT(CAST(CA.CORNER_ATTITUDE_ID AS VARCHAR(40)) FROM(SELECT * FRON CORNER_ATTITUDE WHERE ... '現在、あなたは後で破棄するデータの集まりに' JOIN'しています。同じ行に沿って、いくつかの列だけが必要なときに 'SELECT * 'を使い、特にそれらの列を' SELECT'することができます。 –

関連する問題