日期:2014-05-17  浏览次数:20401 次

存储过程执行过慢
这是我的一个存储过程,作用在两个不同的数据库中,第一个数据库正常执行,但在第二个数据库中执行的时候通常要好几分钟才能执行完毕,请学长们帮我看看谢谢!
DECLARE @count int
DECLARE @NO    varchar(10)
DECLARE @NAME VARCHAR(30)
DECLARE @PRICE MONEY
DECLARE @SALE_PRICE MONEY
DECLARE @STOCK_QTY_SUM INT
DECLARE @SALE_QNTY INT
DECLARE @OPER_DATE DATETIME
DECLARE CURSOR1 CURSOR FOR select DISTINCT pos_t_saleflow.item_no  from pos_t_saleflow  where  DATEDIFF(day, pos_t_saleflow.oper_date,GETDATE()) < 7 --查询7天之内销售商品流水
OPEN cursor1
FETCH NEXT FROM cursor1 into @no

while @@fetch_status = 0
begin
select @STOCK_QTY_SUM=sum(stock_qty) from wh_stock where item_no = @no --根据条码查找库存数量
select @SALE_QNTY=sum(sale_qty),@OPER_DATE=oper_date from pos_t_saleflow where item_no = @no AND DATEDIFF(day, pos_t_saleflow.oper_date,GETDATE()) < 7 GROUP BY OPER_DATE--7天之内销售商品的总数
select @NAME=item_name,@PRICE=in_price,@SALE_PRICE=sale_price from  item where item_no = @no--根据条码查找商品的名称、进货价、零售价
insert into item_sale_status(item_no,item_name,item_stock_qty,item_sale_qnty,item_info_price,item_sale_price/*,item_oper_date*/) 
values (@no,@NAME,@STOCK_QTY_SUM,@SALE_QNTY,@PRICE,@SALE_PRICE/*,@OPER_DATE*/)--将查找到得结果一条一条添加到item_sale_status表中
FETCH NEXT FROM cursor1 into @no

end
close cursor1                    --关闭游标
deallocate cursor1

------解决方案--------------------
如果两个都是相同的环境,可以考虑重建或重新组织索引,可以参考:
<重新组织和重新生成索引sp_RefreshIndex>
http://www.cnblogs.com/wghao/archive/2012/12/27/2835971.html
------解决方案--------------------
1、两台服务器的可比性较小,要看配置;
2、看看相关表的环境,是否一样(相关主外键索引等);
3、关于楼主的需求,按4楼说的可以直接用表连接的方式得到,不一定非要用到游标,这样反而会降低执行的效率。