有关查询语句开销超出了配置的阈值

z184931481 2010-10-11 09:41:41
环境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。请与系统管理员联系。


急求解决办法,在线等
...全文
748 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zsh0809 2010-10-11
----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
回复
SQLCenter 2010-10-11
先优化这里了,看这个形式,应该是动态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')
回复
zsh0809 2010-10-11
好了,不要再精辟了,帮人解决问题吧。
LZ先优化SQL试试看,能不能解决你的问题。
回复
z184931481 2010-10-11
[Quote=引用 16 楼 sqlcenter 的回复:]
一根稻草压垮骆驼,那根稻草是导火线,之前骆驼已经处于垮的临界状态
[/Quote]

精辟
回复
zsh0809 2010-10-11
[Quote=引用 16 楼 sqlcenter 的回复:]

一根稻草压垮骆驼,那根稻草是导火线,之前骆驼已经处于垮的临界状态
[/Quote]
哇塞,你什么时候变身哲学家了
回复
winstonbonaparte 2010-10-11
[Quote=引用 16 楼 sqlcenter 的回复:]

一根稻草压垮骆驼,那根稻草是导火线,之前骆驼已经处于垮的临界状态
[/Quote]
太太太。。。。精僻了。。。。
回复
SQLCenter 2010-10-11
一根稻草压垮骆驼,那根稻草是导火线,之前骆驼已经处于垮的临界状态
回复
zsh0809 2010-10-11
[Quote=引用 13 楼 z184931481 的回复:]

如何优化DISTINCT这条语句
[/Quote]
DISTINCT是你业务逻辑,有什么优化的。
回复
zsh0809 2010-10-11
[Quote=引用 12 楼 z184931481 的回复:]

不是索引的问题,是不是DISTINCT带来的问题
[/Quote]
为什么不会是index的问题,如果有表扫描的地方,你串接了三张表,你的性能会好么?
回复
z184931481 2010-10-11
如何优化DISTINCT这条语句
回复
z184931481 2010-10-11
不是索引的问题,是不是DISTINCT带来的问题
回复
hovy_yang 2010-10-11
学习了
回复
zsh0809 2010-10-11
先选中这段sql,ctrl + L,看看执行计划,看看有没有table scan的地方,如果有请加上相关index
回复
z184931481 2010-10-11
这段查询语句怎么优化呢
回复
zsh0809 2010-10-11
“查询开销”是指在特定硬件配置中完成查询所需的估计占用时间(秒)

你的查询语句需要进一步优化,可以通过优化解决不了,只能更改开销时间上限值。
回复
z184931481 2010-10-11
我想问的是,语句为什么超过限定的开销,是语句执行效率问题,还是什么
回复
zsh0809 2010-10-11
[Quote=引用 3 楼 z184931481 的回复:]

除了重新配置阈值,还有其他办法没
旁加问题,为什么2000下可以而2005规则下不行,是不是对应补丁问题
[/Quote]
看看5#的链接,微软的建议解决方案-----将QUERY_GOVERNOR_COST_LIMIT 选项设置为更大的值
回复
zsh0809 2010-10-11
http://technet.microsoft.com/zh-cn/library/aa337374.aspx

解释

查询已取消,因为此查询的估计开销超出了为 QUERY_GOVERNOR_COST_LIMIT 设置的配置阈值。
用户操作

将 QUERY_GOVERNOR_COST_LIMIT 选项设置为更大的值。
请参阅
其他资源
SET QUERY_GOVERNOR_COST_LIMIT (Transact-SQL)
回复
zsh0809 2010-10-11
在服务属性里 可以看到查询时间,修改该值(300)
回复
z184931481 2010-10-11
除了重新配置阈值,还有其他办法没
旁加问题,为什么2000下可以而2005规则下不行,是不是对应补丁问题
回复
加载更多回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-11 09:41
社区公告
暂无公告