日期:2014-05-19  浏览次数:20459 次

同样的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)) + '
)