我知道下面的查询不是最好的,但现在它必须完成这项工作:
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
子句中,如果我取消注释它运行的最后条件非常慢。我做错了什么?
答案 0 :(得分:3)
这看起来好像是根据参数值确定where子句。在性能方面执行此操作的最有效方法通常是使用动态SQL动态构建查询,以便您不必在where子句中使用函数。
答案 1 :(得分:2)
尝试替换为:
(@Street1 IS NULL OR @Street1 = '' OR f.STREET1 = @Street1)
答案 2 :(得分:2)
当您执行查询时(在两种情况下)都转到SSMS中的“查询”菜单,然后选择“包括实际执行计划”。这将告诉您查询的具体部分是缓慢的,为什么。
我意识到这不是您问题的直接答案,但它是一种非常有用的方法,您可以通过它来研究和解决自己的问题,并学习如何更好地诊断慢速查询。