同样的select查询语句时间会差这么多
CREATE   PROCEDURE   [ttb]      @sitem   char(40),@sear_date1   datetime,   @sear_date2   datetime      AS 
 select   inout_name,cinvcode,sub_name,sum(sub_num1)   as   sub_num   from   v_record   where   inout_prdt= '配料领用 '   and   inout_data   between   @sear_date1   and   @sear_date2   and   cl_name= '1 '   and   inout_name   in   ( 
 select   distinct   sub_name   from   v_record   where   inout_prdt= '正常领用 '   and   rtrim(jl_items)+rtrim(base_name)=@sitem   )   group   by   inout_name,cinvcode,sub_name 
 然后查询分析器里执行如下: 
 exec   ttb    'h0966184zi2 ', '2007-06-29 ', '2007-07-15 ' 
 要一分钟,按道理应该不会要这么久 
 我改成 
 CREATE   PROCEDURE   [ttb]   AS 
 declare   @sitem   char(40),@sear_date1   datetime,   @sear_date2   datetime 
 set   @sear_date1   =    '2007-06-29 ' 
 set   @sear_date2   =    '2007-07-15 ' 
 set   @sitem= 'h0966184zi2 ' 
 select   inout_name,cinvcode,sub_name,sum(sub_num1)   as   sub_num   from   v_record   where   inout_prdt= '配料领用 '   and   inout_data   between   @sear_date1   and   @sear_date2   and   cl_name= '1 '   and   inout_name   in   ( 
 select   distinct   sub_name   from   v_record   where   inout_prdt= '正常领用 '   and   rtrim(jl_items)+rtrim(base_name)=@sitem   )   group   by   inout_name,cinvcode,sub_name 
 同样在查询分析器里执行一秒都不到 
 查询语句是一样的。为什么时间会差这么多。
------解决方案--------------------一个参数,一个变量,前者所需时间多点
------解决方案--------------------你的v_record 有索引?   
 试下这么改   
 CREATE PROCEDURE [ttb]  @sitem char(40),@sear_date1 datetime, @sear_date2 datetime  AS 
 select inout_name,cinvcode,sub_name,sum(sub_num1) as sub_num    
 from v_record with (index indexname)       --这里指定索引   
 where inout_prdt= '配料领用 ' and inout_data between @sear_date1 and @sear_date2 and cl_name= '1 ' and inout_name in ( 
 select distinct sub_name from v_record where inout_prdt= '正常领用 ' and rtrim(jl_items)+rtrim(base_name)=@sitem ) group by inout_name,cinvcode,sub_name 
------解决方案--------------------inout_data 上有索引吗,没有加上就好了
------解决方案--------------------应该是时间的问题。 
 你第二种用法是预先告诉SQL时间值了。 
 第一种是通知。   
 以前我也试过关于和时间这东东的怪问题,具体过程忘了。 
 大概就是: 
 用SQL自动帮我分析时间过程,效率超低。 
 于是我直接用程序先计算好要需要的时间,再交给MSSQL处理,性能提升超过一百倍。
------解决方案--------------------确实会这样。   
 第二个变量的存储过程编译过后可以直接执行编译的执行计划 
 第一个则不成,如果效率要提高一些的话,可以修改成运行时编译的动态SQL,那样会提高许多,估计和第2个差不多   
 修改如下 
 Create Proc [ttb] ( 
 @sitem char(40), 
 @sear_date1 datetime,  
 @sear_date2 datetime ) 
 As   
 Set Nocount on 
 Declare @Sql_Pqs varchar(8000) 
 Set @Sql_Pqs= 'Select inout_name,cinvcode,sub_name,sum(sub_num1) as sub_num From v_record Where inout_prdt= '配料领用 ' And inout_data Between  '+Cast(@sear_date1 as Varchar(100)) + ' And  '+ Cast(@sear_date2 As Varchar(100))+ ' And cl_name= ' '1 ' ' And inout_name in ( 
 select distinct sub_name from v_record where inout_prdt= '正常领用 ' and rtrim(jl_items)+rtrim(base_name)= '+Cast(@sitem As Varchar(100)) + ' 
 )