语句:
declare @P1 varchar(14),@P2 varchar(1),@P3 varchar(1)
set @P1='PH0001'
set @P2=''
set @P3='C'
SELECT MB001,MB002,MB003,MF004,MW002
FROM INVMB WITH (NOLOCK)
INNER JOIN BOMMF WITH (NOLOCK) ON MB010=MF001 AND MB011=MF002
INNER JOIN CMSMW WITH (NOLOCK) ON MW001=MF004
WHERE @P1 IN (MB001,'') AND @P2 IN (MF004,'') AND MW201=@P3
AND MF209 = 'Y'对INVMB表的MB001做聚焦,执行由31秒降为28秒,晕倒啊。

解决方案 »

  1.   

    WHERE @P1 IN (MB001,'') AND @P2 IN (MF004,'') AND MW201=@P3
    --是不是搞反了?
    WHERE MB001=@P1 AND MF004=@P2 AND MW201=@P3
      

  2.   

    这个搞不搞反,应该无所谓吧。
    @P1 IN (MB001,'') 
    应该是等效于MB001=@P1 or @P1=''的偷懒式写法。语句是跟踪出来的,不能动。只能改索引来优化了。唉。
      

  3.   

    从你的执行计划中看出,根本没有用Index seek,3个表联查,需要3个表都有索引才可以的,一个表有无法提升!
      

  4.   

    WHERE @P1 IN (MB001,'') AND @P2 IN (MF004,'')-->WHERE @P1 IN (isnull(MB001,'')) AND @P2 IN (isnull(MF004,''))