语句是
select CAST(0 as bit)
 checksta,'未发送' sta 
 from
 (Select * from FKTransaction2 Where TransactionNO < LinkNO and LinkNO <> '' and del='0' )  a,
(Select * from FKTransaction2 Where (LinkNO <> '' and del='0') and (LinkNO < TransactionNO)) b,
FKCounterParty c 
where  a.TransactionNO=b.LinkNO  and a.direct like '%回购'  and  a.CounterParty=c.CounterPartyId and 
((a.TradeDate>='20090526' and a.TradeDate<='20090526') or
 (b.TradeDate>='20090526' and b.TradeDate<='20090526')) and  
 a.account in (15,18,27,14,29,30,31,32,33,28,7,8,9,10,11,12,25,26,20,21,22,24)  执行计划不同 我想问一下同一个机器不同窗口或者相同窗口考来的一样SQL 速度(执行计划不一样)不一样

解决方案 »

  1.   

    也就是说,同一个SQL,在机器上的查询分析器中,运行的时间不同,会因为机器当时的情况(比如某时在处理什么...,某时空闲),速度有略微变化,但执行计划不会变.
      

  2.   

    1、建议在测试之前先清空缓存
       dbcc freeproccache
       dbcc dropcleanbuffers
    2、执行计划,可能会根据数据量,软硬件等更方面因素而改变的
      

  3.   

    执行计划不同 
    我想问一下同一个机器不同窗口或者相同窗口考来的一样SQL
     速度(执行计划不一样)不一样不同窗口,不同数据库了?
    执行计划应该不会变吧,只不过速度可能会变因为有缓存
      

  4.   

    看看日志文件是不是太大 或者TEMPDB的空间
      

  5.   

    我回答的是同一个SQL语句,貌似我理解错了?
      

  6.   

      |--Compute Scalar(DEFINE:([Expr1011]=(0), [Expr1012]='未发送'))
           |--Hash Match(Inner Join, HASH:([FX_GF].[dbo].[FKTransaction2].[TransactionNO])=([FX_GF].[dbo].[FKTransaction2].[LinkNO]), RESIDUAL:([FX_GF].[dbo].[FKTransaction2].[TransactionNO]=[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND ([FX_GF].[dbo].[FKTransaction2].[TradeDate]>'20090126' AND [FX_GF].[dbo].[FKTransaction2].[TradeDate]<='20091026' OR [FX_GF].[dbo].[FKTransaction2].[TradeDate]>'20090126' AND [FX_GF].[dbo].[FKTransaction2].[TradeDate]<='20091026')))
                |--Hash Match(Inner Join, HASH:([FX_GF].[dbo].[FKTransaction2].[CounterParty])=([c].[CounterPartyID]), RESIDUAL:([FX_GF].[dbo].[FKTransaction2].[CounterParty]=[FX_GF].[dbo].[FKCounterParty].[CounterPartyID] as [c].[CounterPartyID]))
                |    |--Filter(WHERE:([Expr1013]=(24) OR [Expr1013]=(22) OR [Expr1013]=(21) OR [Expr1013]=(20) OR [Expr1013]=(26) OR [Expr1013]=(25) OR [Expr1013]=(12) OR [Expr1013]=(11) OR [Expr1013]=(10) OR [Expr1013]=(9) OR [Expr1013]=(8) OR [Expr1013]=(7) OR [Expr1013]=(28) OR [Expr1013]=(33) OR [Expr1013]=(32) OR [Expr1013]=(31) OR [Expr1013]=(30) OR [Expr1013]=(29) OR [Expr1013]=(14) OR [Expr1013]=(27) OR [Expr1013]=(18) OR [Expr1013]=(15)))
                |    |    |--Compute Scalar(DEFINE:([Expr1013]=CONVERT_IMPLICIT(int,[FX_GF].[dbo].[FKTransaction2].[Account],0)))
                |    |         |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[TransactionNO]<[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>'' AND [FX_GF].[dbo].[FKTransaction2].[Direct] like '%回购'))
                |    |--Table Scan(OBJECT:([FX_GF].[dbo].[FKCounterParty] AS [c]))
                |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<[FX_GF].[dbo].[FKTransaction2].[TransactionNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>''))
    这个执行计划快
      

  7.   

      |--Compute Scalar(DEFINE:([Expr1011]=(0), [Expr1012]='未发送'))
           |--Merge Join(Inner Join, MANY-TO-MANY MERGE:([FX_GF].[dbo].[FKTransaction2].[CounterParty])=([c].[CounterPartyID]), RESIDUAL:([FX_GF].[dbo].[FKTransaction2].[CounterParty]=[FX_GF].[dbo].[FKCounterParty].[CounterPartyID] as [c].[CounterPartyID]))
                |--Nested Loops(Inner Join, WHERE:([FX_GF].[dbo].[FKTransaction2].[TransactionNO]=[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND ([FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526' OR [FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526')))
                |    |--Sort(ORDER BY:([FX_GF].[dbo].[FKTransaction2].[CounterParty] ASC))
                |    |    |--Filter(WHERE:([Expr1013]=(24) OR [Expr1013]=(22) OR [Expr1013]=(21) OR [Expr1013]=(20) OR [Expr1013]=(26) OR [Expr1013]=(25) OR [Expr1013]=(12) OR [Expr1013]=(11) OR [Expr1013]=(10) OR [Expr1013]=(9) OR [Expr1013]=(8) OR [Expr1013]=(7) OR [Expr1013]=(28) OR [Expr1013]=(33) OR [Expr1013]=(32) OR [Expr1013]=(31) OR [Expr1013]=(30) OR [Expr1013]=(29) OR [Expr1013]=(14) OR [Expr1013]=(27) OR [Expr1013]=(18) OR [Expr1013]=(15)))
                |    |         |--Compute Scalar(DEFINE:([Expr1013]=CONVERT_IMPLICIT(int,[FX_GF].[dbo].[FKTransaction2].[Account],0)))
                |    |              |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[TransactionNO]<[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>'' AND [FX_GF].[dbo].[FKTransaction2].[Direct] like '%回购'))
                |    |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<[FX_GF].[dbo].[FKTransaction2].[TransactionNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>''))
                |--Sort(ORDER BY:([c].[CounterPartyID] ASC))
                     |--Table Scan(OBJECT:([FX_GF].[dbo].[FKCounterParty] AS [c])) 这个执行计划遥遥无期的
      

  8.   


    查询优化器会每次尽量找最优的执行计划,但并不一定是最优的,你可以在关键字join前面指定连接,强制的让它用那一种算法连接
      

  9.   

    同样的SQL为什么从两处复制?
      

  10.   

    是不是SQL里有什么细微的地方不一样导致的,这么长
      

  11.   

    21、22楼是两个不同的语句(条件不一样) 产生的执行计划,楼主你别再忽悠我们了。21楼:
                |--Nested Loops(Inner Join, WHERE:([FX_GF].[dbo].[FKTransaction2].[TransactionNO]=[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND ([FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526' OR [FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526'))) 22楼:
          |--Hash Match(Inner Join, HASH:([FX_GF].[dbo].[FKTransaction2].[TransactionNO])=([FX_GF].[dbo].[FKTransaction2].[LinkNO]), RESIDUAL:([FX_GF].[dbo].[FKTransaction2].[TransactionNO]=[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND ([FX_GF].[dbo].[FKTransaction2].[TradeDate]>'20090126' AND [FX_GF].[dbo].[FKTransaction2].[TradeDate] <='20091026' OR [FX_GF].[dbo].[FKTransaction2].[TradeDate]>'20090126' AND [FX_GF].[dbo].[FKTransaction2].[TradeDate] <='20091026'))) 
      

  12.   

    我只是改了时间 同样时间是一样的是我考错了我就这么说时间一样执行语句也不一样!  就是差那么多 !
    我把 时间都改过成'20090526'   试过! 我才发帖子的! 一个很快用HASH  查出没数据 一个一直没结果! 我现在怀疑是MSSQL BUG
      

  13.   

    这个是慢的在20090526 执行计划
     |--Compute Scalar(DEFINE:([Expr1011]=(0), [Expr1012]='未发送'))
           |--Merge Join(Inner Join, MANY-TO-MANY MERGE:([FX_GF].[dbo].[FKTransaction2].[CounterParty])=([c].[CounterPartyID]), RESIDUAL:([FX_GF].[dbo].[FKTransaction2].[CounterParty]=[FX_GF].[dbo].[FKCounterParty].[CounterPartyID] as [c].[CounterPartyID]))
                |--Nested Loops(Inner Join, WHERE:([FX_GF].[dbo].[FKTransaction2].[TransactionNO]=[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND ([FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526' OR [FX_GF].[dbo].[FKTransaction2].[TradeDate]='20090526')))
                |    |--Sort(ORDER BY:([FX_GF].[dbo].[FKTransaction2].[CounterParty] ASC))
                |    |    |--Filter(WHERE:([Expr1013]=(24) OR [Expr1013]=(22) OR [Expr1013]=(21) OR [Expr1013]=(20) OR [Expr1013]=(26) OR [Expr1013]=(25) OR [Expr1013]=(12) OR [Expr1013]=(11) OR [Expr1013]=(10) OR [Expr1013]=(9) OR [Expr1013]=(8) OR [Expr1013]=(7) OR [Expr1013]=(28) OR [Expr1013]=(33) OR [Expr1013]=(32) OR [Expr1013]=(31) OR [Expr1013]=(30) OR [Expr1013]=(29) OR [Expr1013]=(14) OR [Expr1013]=(27) OR [Expr1013]=(18) OR [Expr1013]=(15)))
                |    |         |--Compute Scalar(DEFINE:([Expr1013]=CONVERT_IMPLICIT(int,[FX_GF].[dbo].[FKTransaction2].[Account],0)))
                |    |              |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[TransactionNO]<[FX_GF].[dbo].[FKTransaction2].[LinkNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>'' AND [FX_GF].[dbo].[FKTransaction2].[Direct] like '%回购'))
                |    |--Table Scan(OBJECT:([FX_GF].[dbo].[FKTransaction2]), WHERE:([FX_GF].[dbo].[FKTransaction2].[Del]=(0) AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<[FX_GF].[dbo].[FKTransaction2].[TransactionNO] AND [FX_GF].[dbo].[FKTransaction2].[LinkNO]<>''))
                |--Sort(ORDER BY:([c].[CounterPartyID] ASC))
                     |--Table Scan(OBJECT:([FX_GF].[dbo].[FKCounterParty] AS [c]))这个是快的在20090526 的执行计划
      |--Constant Scan
      

  14.   

    时间不一样,生成的执行计划就可能不一样,楼主你玩oracle的,这个会不知道?
      

  15.   

    那就是机品问题了。至少一模一样的sql,在SQL Server Management Studio不同的窗口还没看到过完全不同的sql执行计划。
      

  16.   

    确定环境都一样(CPU空闲,剩余内存都一样),清空缓存,再看下2次计划是不是一样
      

  17.   

    问题多去了,但不见得都是BUG。
    审视自己,检讨问题。
      

  18.   

    200 谁能得到邹建在 微软论坛告诉我怎么做可是怎么做我知道啊!我要问原因!! 为何这样子要不要我发出2个相同的SQL 给他们分析下16进制有没有区别
      

  19.   

    帖出完整的图片出来吧。完整的SQL语句加上完整的执行计划的图,都帖出来。
      

  20.   

    应该不会把,特列,和事巧合!sql语句会在同一台机子上也有可能,时间不同!
    计划任务,应该不会吧,
    =====================
    难道你的内存,不稳定!
      

  21.   

    SQL SEVER选用当前已经执行计划,有很多判断条件。 不一定采用已有的计划。 尤其是当查询条件存在计算的是时候。