大家好,一条sql语句select @t_yearaop=isnull(sum(test1),0.00) from test_test 
where aa=@name
and bb=@t_ipdwcode
and testdate=year(getdate());索引为组合索引:aa,bb
这条语句在查询分析器中执行时间是0.1秒,但在存储过程中执行是50秒钟,请问原因是什么?

解决方案 »

  1.   

    存储过程的执行计划是编译好了的
    当你用存储过程执行时,采用的可能是上一次的执行计划,所以效率上会有差别尝试指定WITH  RECOMPILE 试试.CREATE PROC spxxx 
    WITH RECOMPILE 
    AS
    ......
      

  2.   

    该表有1000万条记录,确实不可思议,请教各位?
    我已经exec sp_recompile 过程,或者重建过程,太无效.
      

  3.   

    感谢hery2002 ,但我不是这种原因,仔细查看以下语句:
    select @t_yearaop=isnull(sum(test1),0.00) from test_test 
    where aa=@name 
    and bb=@t_ipdwcode 
    and testdate=year(getdate()); 是要sum,如果没有查完数据,怎么能统计出结果了?
      

  4.   

    1.帖出SP的完整代码.2.执行前清掉緩存
      DBCC DROPCLEANBUFFERS
      

  5.   

    补充一下,如果@name 和@t_ipdwcode 有具体值,存储过程就很快了,不知道为什么?
    select @t_yearaop=isnull(sum(test1),0.00) from test_test 
    where aa=@name 
    and bb=@t_ipdwcode 
    and testdate=year(getdate()); 
      

  6.   


    LZ能不能试试在你的存储过程中使用本地变量, 然后看看运行时间. 存储过程应该象:create.....
    as
    declare @name_local  ---数据类型跟@name一样
    declare @t_ipdwcode_local ---数据类型跟@t_ipdwcode一样select @t_yearaop=isnull(sum(test1),0.00) from test_test 
    where aa=@name_local
    and bb=@t_ipdwcode_local
    and testdate=year(getdate()); 
    ...
    请一定告诉偶运行时间是快了还是慢了. 谢谢!!!!
    (如果运行时间变了, 偶再来解释.....*_*)
      

  7.   

    对不起, 上面的回贴忘了赋值了:...
    set @name_local = @name
    set @t_ipdwcode_local = @t_ipdwcode
    ....
      

  8.   

    对不起了再次, 才发现你之前已经发过类似的一贴了. 只不过这贴子里你指明是SQL2000.以前的贴子:
    http://topic.csdn.net/u/20080717/08/e7abcc5d-6984-47a8-87c0-c10dd58272d6.html