同样的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)) + '
)
group by inout_name,cinvcode,sub_name '
Execute(@Sql_Pqs)
Set Nocount Off
Go