我有一个基于参数检查需要很长时间的SQL查询....
它自身的查询是用于搜索屏幕的存储过程的一部分。基本上你填写一个包含大量文本/组合框的表单来搜索。我有多选组合框,它们将以分隔字段的方式为同一个字段传递多个值。
以下是查询的简化版本,以说明我的问题......
select
o.id,
o.createdBy
into
#results
from
jmsTransOther o
where
o.(WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ',')) <strong>OR @WorkOrderIds = ''</strong>)
我经常使用这个参数检查OR @WorkOrderIds = ''
这基本上意味着如果不是这样,那么执行语句的另一面。
这在大多数情况下都能很好地工作,但由于某种原因,这个fn_SplitInts
函数基本上将分隔列表转换为表格,然后执行&#34; IN&#34;声明花了很长时间。
此表中有大约200,000条记录 - 目前搜索大约需要40秒。但是,如果我删除参数检查,即OR @WorkOrderIds = ''
,则需要不到一秒钟。
我可以解决它,但只是想知道这里发生了什么......?
答案 0 :(得分:0)
我可能会建议这个表述:
select o.id, o.createdBy
into #results
from jmsTransOther o
where o.WorkOrderId IN (SELECT intValue FROM dbo.fn_SplitInts(@WorkOrderIds, ','))
union all
select o.id, o.createdBy
from jmsTransOther o
where @WorkOrderIds = '';
or
可能搞乱了统计数据。 (我也会使用NULL
而不是空字符串来表示&#34;所有这些&#34;。)