环境WINDOWS 2003+ SQL 2005
SQL 语句
      SELECT distinct ISNull(e.FNumber,'') AS FShopNumber,ISNull(e.FName,'') AS FShopName,S.FBillNo,S.FDate,sum(SE.famount) famount,e.FSendDay,
DateDiff(day,DateAdd(day,FSendDay,S.FCheckDate),GetDate()) AS FDiffDay
From 
SEOutStock S Inner Join SEOutStockEntry SE On S.FInterID=SE.FInterID
Left Join t_Emp e On S.FEMPID=e.FItemID
WHERE
S.FDate>='2008-01-01' and s.FTrantype=83 
AND  S.FBillNo Not In (Select FBillNO_Src From t_ItemCheckentry)
AND (''='' Or e.FNumber<='') AND (''='' Or e.FNumber>='')
AND (''='' OR S.FBillNo>='') AND (''='' OR S.FBillNo<='')
AND ('2010-08-31'='' OR S.FDate<='2010-08-31')
group by s.fbillno,s.fdate,e.FNumber,e.FName,e.fsendday,S.FCheckDate
ORDER BY FDiffDay错误类型
    服务器: 消息 8649,级别 17,状态 1,行 1
查询已取消,因为此查询的估计开销(319)超出了配置的阈值 300。请与系统管理员联系。
急求解决办法,在线等
 

解决方案 »

  1.   

    http://technet.microsoft.com/zh-cn/library/aa337374.aspx 解释查询已取消,因为此查询的估计开销超出了为 QUERY_GOVERNOR_COST_LIMIT 设置的配置阈值。
     用户操作将 QUERY_GOVERNOR_COST_LIMIT 选项设置为更大的值。
     请参阅
    其他资源
    SET QUERY_GOVERNOR_COST_LIMIT (Transact-SQL)
      

  2.   

    看看5#的链接,微软的建议解决方案-----将QUERY_GOVERNOR_COST_LIMIT 选项设置为更大的值
      

  3.   

    先选中这段sql,ctrl + L,看看执行计划,看看有没有table scan的地方,如果有请加上相关index
      

  4.   

    不是索引的问题,是不是DISTINCT带来的问题
      

  5.   

    为什么不会是index的问题,如果有表扫描的地方,你串接了三张表,你的性能会好么?
      

  6.   

    DISTINCT是你业务逻辑,有什么优化的。
      

  7.   

    好了,不要再精辟了,帮人解决问题吧。
    LZ先优化SQL试试看,能不能解决你的问题。
      

  8.   

    先优化这里了,看这个形式,应该是动态SQL串接出来的结果,参数=''就不加条件,有值才加:AND (''='' Or e.FNumber<='') AND (''='' Or e.FNumber>='')
    AND (''='' OR S.FBillNo>='') AND (''='' OR S.FBillNo<='')
    AND ('2010-08-31'='' OR S.FDate<='2010-08-31')
      

  9.   

    ----select部分基本没什么优化的
    SELECT distinct ISNull(e.FNumber,'') AS FShopNumber,
                ISNull(e.FName,'') AS FShopName,S.FBillNo,S.FDate,
                sum(SE.famount) famount,e.FSendDay,
                DateDiff(day,DateAdd(day,FSendDay,S.FCheckDate),GetDate()) AS FDiffDay
    From SEOutStock S          -----JOIN部分,还是检查下index问题
    Inner Join SEOutStockEntry SE 
    On S.FInterID=SE.FInterID
    Left Join t_Emp e On S.FEMPID=e.FItemID
    WHERE
     ----where条件部分逻辑看上去不是很清晰,如S.FDate>='2008-01-01',你下面又有AND ('2010-08-31'='' OR S.FDate<='2010-08-31')出现,还有AND (''='' Or e.FNumber<='') AND (''='' Or e.FNumber>='')这两个可以整合到一起去。
    S.FDate>='2008-01-01' and s.FTrantype=83 
    AND S.FBillNo Not In (Select FBillNO_Src From t_ItemCheckentry)
    AND (''='' Or e.FNumber<='') AND (''='' Or e.FNumber>='')
    AND (''='' OR S.FBillNo>='') AND (''='' OR S.FBillNo<='')
    AND ('2010-08-31'='' OR S.FDate<='2010-08-31')
    group by s.fbillno,s.fdate,e.FNumber,e.FName,e.fsendday,S.FCheckDate
    ORDER BY FDiffDay
      

  10.   

    减少where 条件后面的 OR 的用法 不然有可能会导致表扫描 而非索引扫描 尽量避免用之 以除后患
      

  11.   

    哈哈,是查询超出了SQL Server服务器最大的超时时间,要么优化SQL,要么把这个值调为0,为不超时
      

  12.   

    or会对性能有影响的,尽量少用or