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 回答
2

尝试用这个替换:

(@Street1 IS NULL OR @Street1 = '' OR f.STREET1 = @Street1)
于 2013-04-11T14:45:27.923 回答