SELECT InfoID,aa.AssignApprover,aa.ActualApprover,wfpi.ProcessState 
FROM wf.WFLOW.dbo.WF_ProcessInstances WFPI 
INNER JOIN wf.WFLOW.dbo.WF_ACTInstances ai ON ai.Process_Instance_ID=WFPI.Process_Instance_ID 
INNER JOIN wf.WFLOW.dbo.WF_ACTApprovers aa ON aa.ACT_Instance_ID=ai.ACT_Instance_ID
--WHERE ProcessState =2 AND ISNULL(InfoID,'')<>'' AND WFPI.Expression='002' 
--WHERE WFPI.Expression='002' AND WFPI.ProcessState =2 AND ISNULL(WFPI.InfoID,'')<>''
WHERE ISNULL(WFPI.InfoID,'')<>'' AND WFPI.Expression='002' AND WFPI.ProcessState =2  where 条件中有三个条件,任意两个条件组合都没问题,但三个条件一起用,就奇慢无比,  哪位帮忙看看怎么回事啊SQLselect

解决方案 »

  1.   


    发执行计划上来,看一下就知道了。 
    Ctrl+L 
      

  2.   

    ISNULL(WFPI.InfoID,'')<>''  用不到索引的啊。还是执行计划上来看看。
      

  3.   


    发执行计划上来,看一下就知道了。 
    Ctrl+L 
      

  4.   


    远程查询这里,完全看不到具体针对表的评估执行计划。无法直接定位问题发生点。 不过这里针对写法提个建议。--另,如果是远程打开仅仅是单次使用,建议使用openrowset;相对于使用链接服务器设置,要快一些。SELECT  InfoID ,                  --输出列表如果没有针对ai的数据,可以考虑使用exists进行处理
            aa.AssignApprover ,
            aa.ActualApprover ,
            wfpi.ProcessState
    FROM    wf.WFLOW.dbo.WF_ProcessInstances WFPI
            INNER JOIN wf.WFLOW.dbo.WF_ACTInstances ai ON ai.Process_Instance_ID = WFPI.Process_Instance_ID
            INNER JOIN wf.WFLOW.dbo.WF_ACTApprovers aa ON aa.ACT_Instance_ID = ai.ACT_Instance_ID
    WHERE   
    ISNULL(WFPI.InfoID, '') <> ''  --此处写法应该是用不到索引的
            AND WFPI.Expression = '002'
            AND WFPI.ProcessState = 2
            
    --更多的信息,lz如果可能,请给出具体含表的评估执行计划 
      

  5.   

    ISNULL(WFPI.InfoID,'')<>''  改成  WFPI.InfoID>'' 试试看
      

  6.   

    大的开销都在远程查询啊,可以尝试用OPENROWSET或者OPENDATASOURCE试试。
      

  7.   

    --把ISNULL(WFPI.InfoID, '') <> ''
    --改为WFPI.InfoID IS NOT NULL AND WFPI.InfoID<>'' 就行了, ISNULL函数开销这么大么