sql server2000 升级到sql server2005,一个存储过程执行时间变的很长,求救!高手请进

szluoyq 2013-11-24 09:41:35
sql server2000 升级到sql server2005后,一个存储过程执行时间变的很长,在sql server2000下执行10来秒,在sql server2005下执行12分钟左右,请高手帮忙。很急!

调试,主要是下面教本慢,fact_pmrelate 700W条记录
Select f.Goodsid, r.RawId,
sum(round(PerWaste * r.Factor * (case when isnull(f.factor ,0)<=0 then 1 else 1/f.factor end), 9)) As PerWaste,
sum(round(case When p.Waste = 1 Then 0 Else p.PerWaste * r.Factor * p.Waste * (case when isnull(f.factor ,1)<=0 then 1 else 1/f.factor end)/(1 - p.Waste) End,5)) As Waste,
@userid define_by, @sysdate define_time, @userid modi_man, @sysdate modi_date
Into #temp_create_new_goods_cons
From Fact_Pmrelate p ,Fact_Raw r, #temp_create_new_goods f, raw t
Where p.Fmid = r.Fmid And
p.FPid = f.Fpid And
p.OrgNo = @OrgNo And
r.RawId = t.RawId
Group By f.Goodsid ,r.RawId

曾做过的优化,内存优化,临时tempdb加大,fact_pmrelate重新建立索引,及表重新建立,该数据库采用附加或者还原都处理过,升级到sql server2008也一样,分解该SQL 处理都无明细变化,估计是sql server内部机制发生变化,请高手帮忙解决,非常感谢!


...全文
205 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
csluoyq 2013-11-30
感谢各位的指点,原因找到,是一个触发器的not in语句执行时间要6分钟,换成另一种写法,几秒钟就可以了.
回复
那么具体到你这个运行慢的语句来说,你可以先试试把这几个表的统计信息,重新生成以下: update statistics Fact_Pmrelate update statistics Fact_Raw update statistics raw
回复
之前也有人从200升级到2005或2008,出现了性能问题,很多是由于同一个语句写法,在2000和2005中的处理方式不同,准确来说应该是sql server的内部机制可能是有变化导致的,比如select top 在2000的时候语句只需要10秒,但在2008可能需要运行2分钟。 但从你的语句上来看,是标准的多表关联,应该从sql server 2000到2005,处理的机制应该变化不大。 更有可能是统计信息的不准确导致的,因为在微软sql server的升级指导中,就明确指出,在升级后,最好把主要的表,更新统计信息,这样能生成适合新版本的统计信息,易于优化器生成比较好的执行计划。
回复
天善智能 2013-11-25
可能表上的索引丢失,或者是统计信息过期,需要重新更新一下
回复
發糞塗牆 2013-11-25
在2005界面上,对着这个脚本的空白处右键,选择数据库引擎顾问,然后让它自己跑一下,可能丢失索引,也可能统计信息由于升级而需要重建、更新
回复
發糞塗牆 2013-11-25
执行计划贴出来看看
回复
szluoyq 2013-11-25
2楼的没效,7楼的也没效,估计不是脚本问题,希望大家提供服务器性能方面优化,例如内存.谢谢
回复
唐诗三百首 2013-11-25
try this,

-- 重建索引
dbcc dbreindex('Fact_Pmrelate','',90)

-- 更新统计信息
update statistics Fact_Pmrelate 

-- 确认SQL2005该表索引情况是否与SQL2000该表一致.

-- 改为这样写法试一下..
Select f.Goodsid,r.RawId,
sum(round(PerWaste*r.Factor*(case when isnull(f.factor ,0)<=0 then 1 else 1/f.factor end), 9)) As PerWaste,
sum(round(case When p.Waste = 1 Then 0 Else p.PerWaste * r.Factor * p.Waste * (case when isnull(f.factor ,1)<=0 then 1 else 1/f.factor end)/(1 - p.Waste) End,5)) As Waste,
@userid define_by, @sysdate define_time, @userid modi_man, @sysdate modi_date
Into #temp_create_new_goods_cons
From Fact_Pmrelate (nolock) p
inner join Fact_Raw (nolock) r on p.Fmid=r.Fmid
inner join #temp_create_new_goods f on p.FPid = f.Fpid 
inner join raw (nolock) t on r.RawId=t.RawId
where p.OrgNo=@OrgNo
Group By f.Goodsid,r.RawId
回复
發糞塗牆 2013-11-25
引用 6 楼 szluoyq 的回复:
谢谢大家的帮助,yupeigu的很有效,从12分钟降到了7分钟.还需要继续优化.
2楼的没效?最近才搞过一次迁移,十几分钟降到秒级
回复
szluoyq 2013-11-25
谢谢大家的帮助,yupeigu的很有效,从12分钟降到了7分钟.还需要继续优化.
回复
Q315054403 2013-11-24
既然有条件OrgNo,而2000下也需要10秒,说明需要统计的内容是很多的 有偿提供优化支持,呵
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

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