簡體   English   中英

使用動態WHERE子句進行慢速查詢

[英]Slow Query with Dynamic WHERE Clause

我知道以下查詢不是最好的查詢,但是現在它必須完成此工作:

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子句上,如果我取消注釋它運行的最后條件非常慢。 我究竟做錯了什么?

看起來好像您是根據參數的值確定where子句的。 在性能方面執行此操作的最有效方法通常是使用動態SQL動態構建查詢,以便您不必在where子句中使用函數。

嘗試替換為:

(@Street1 IS NULL OR @Street1 = '' OR f.STREET1 = @Street1)

當您執行查詢時(在兩種情況下)都轉到SSMS中的“查詢”菜單,然后選擇“包括實際執行計划”。 這將告訴您查詢中緩慢的特定部分以及原因。

我意識到這不是您問題的直接答案,但它是一種非常有用的方法,您可以通過它來研究和解決您自己的問題,並學習如何更好地診斷慢速查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM