2

以下のクエリが最適ではないことはわかっていますが、今はそれでうまくいく必要があります。

FROM dbo.CE_Summons_ext0 s with (nolock)
     INNER JOIN dbo.CE_Fines_ext0 f with (nolock)
       ON (f.ref_no = s.ref_no AND f.doc_type = s.doc_type)
     INNER JOIN dbo.CE_charge_status c with (nolock)
       ON f.status = c.status_no
     INNER JOIN dbo.CE_COURT_DESC crt_desc with (nolock)
       ON crt_desc.COURT = s.COURT
     INNER JOIN dbo.CE_CntParms_ext0 param with (nolock)
       ON param.REF_NO = s.ref_no
     INNER JOIN dbo.CE_Court_result crt_result with (nolock)
       ON crt_result.COURT_RESULT = param.COURT_RESULT
  WHERE   s.SUMMONS_NO = isnull(nullif(@sms_summons_no, ''), s.SUMMONS_NO)
      AND s.ref_no = isnull(nullif(@scp_ref_no,''), s.ref_no)
      AND s.COURT =  isnull(nullif(@sms_court,'') , s.COURT)
      -- AND f.STREET1 = isnull(nullif(@street1,''), f.STREET1) 
      -- AND f.acc_name = isnull(nullif(@offender_name,''), f.acc_name)
      -- AND f.id_no = isnull(nullif(@offender_id,''), f.id_no)
      -- AND f.acc_name = isnull(nullif(@owner_name,''), f.acc_name)
      -- AND f.id_no = isnull(nullif(@owner_id,''), f.id_no)
  END

WHERE最後の条件のコメントを外すと、条項で非常に遅くなります。私は何を間違っていますか?

4

3 に答える 3

3

これは、パラメーターの値に基づいて where 句を決定しているように見えます。パフォーマンスの観点からこれを行う最も効果的な方法は、通常、動的 SQL を使用してクエリを動的に構築し、where 句で関数を使用する必要がないようにすることです。

于 2013-04-11T14:50:04.343 に答える
2

クエリを実行している場合 (どちらの場合も)、SSMS の [クエリ] メニューに移動し、[実際の実行計画を含める] を選択します。これにより、遅いクエリの特定の部分とその理由がわかります。

これはあなたの質問に対する直接的な回答ではないことは承知していますが、遅いクエリをより適切に診断する方法を学ぶだけでなく、自分の問題を調査して解決するための非常に便利な手段です。

于 2013-04-11T14:50:47.620 に答える