2017-10-20 295 views
0

我有一个SQL查询是花了很长时间根据参数检查....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函数基本上将分隔列表转换为表格,然后执行“IN”语句需要很长时间。

该表格中有大约200,000条记录 - 目前这大约需要40秒才能搜索。但是,如果我删除了参数检查,即OR @WorkOrderIds = '',那么它不到一秒钟。

我可以解决它,但只是想知道这里发生了什么....?

+0

这几乎肯定是一个参数嗅探问题。简短的解决方案是简单地在存储过程中添加“WITH RECOMPILE”。我建议你在一般的参数嗅探方面做一些研究,但是,只要你知道最近发生了什么 –

+0

@ Nick.McDermaid没有想到这一点。我之前有过这个问题。但是,当我在查询窗口中单独测试查询时,我遇到了同样的问题?现在这是否排除了参数嗅探问题? –

+0

编号任何客户端应用程序(SSMS或Web应用程序)都可能引起参数嗅探 –

回答

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而不是空字符串来表示“所有这些”。)

+0

不幸的是,我有大约6这些相同的参数检查在哪里条件,这将意味着这种解决方案将变得相当混乱的不同标准... –

+0

@GlenHong。 。 。只能回答你提出的问题。如果您有其他问题,请将其作为*新问题。编辑这个问题只会导致服务器无效,这个问题可能会导致低估。 –

+0

那么在最后一行有一个问题......我真的没有看到这么多的解决方案,因为我可以解决它。我更加关注是什么导致了这个问题......正如尼克美人鱼指出他认为是问题所在 –