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

对存取过程编译的一个疑惑
下面2段代码 第一个在没有 into #temp 没有结果集的时候就会变慢,于是 我在第二段加入了一个if exists(select * from #temp),但是出现了一个很奇怪的问题


如果第一次运行存取过程的时候 没有结果集, 那么以后执行的情况没有结果集的情况非常快,有结果集的非常慢(可以慢到2,3秒), 如果第一次运行有结果集 ,那么情况反过来了,有结果集的非常快,没有结果集的变慢(接近1秒)

这是什么情况?

SQL code

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CarVehicleData_tbl_GetMaxData]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CarVehicleData_tbl_GetMaxData]
GO
------------------------------------
--用途:查询记录信息 
--项目名称:
--说明:
--时间:2012/5/12 15:37:58
------------------------------------
CREATE PROCEDURE CarVehicleData_tbl_GetMaxData
@C_ID int
 AS  

select   top 1000 *   into #temp
                                                        from     [CarVehicleData_tbl]
                                                        where    c_id = @c_id
                                                        order by [CSN_UpdateTime] desc


select   c_id,[CSN_Part],CSN_NumberDataOriginal = max(case csn_type 
                                                                                                                when 0 then [CSN_DataOriginal]
                                                                                                            end),CSN_NumberUpdateTime = max(case csn_type 
                                                                                                                                    when 0 then [CSN_UpdateTime]
                                                                                                                                end),CSN_StatusDataOriginal = max(case csn_type 
                                                                                                                                                 when 1 then [CSN_DataOriginal]
                                                                                                                                             end),CSN_StatusDataUpdateTime = max(case csn_type 
                                                                                                                                                            when 1 then [CSN_UpdateTime]
                                                                                                                                                        end)
from     (select *,(select   top 1 [CSN_DataOriginal]
                                        from     #temp a
                                        where    b.csn_updateTime = a.csn_updateTime
                                        and b.csn_type = a.csn_type
                                        and b.csn_part = a.csn_part
                                        and a.C_ID = @C_ID
                                        order by csn_updateTime desc) as [CSN_DataOriginal]
                    from   (select   max([CSN_ID])          as [CSN_ID],c_id,[CSN_Part],[CSN_Type],max([CSN_UpdateTime])  as [CSN_UpdateTime]
                                    from     #temp c
                                    group by c_id,[CSN_Part],[CSN_Type]) b) d
group by c_id,[CSN_Part]

drop table #temp
GO




SQL code

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CarVehicleData_tbl_GetMaxData]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CarVehicleData_tbl_GetMaxData]
GO
------------------------------------
--用途:查询记录信息 
--项目名称:
--说明:
--时间:2012/5/12 15:37:58
------------------------------------
CREATE PROCEDURE CarVehicleData_tbl_GetMaxData
@C_ID int
 AS  

select   top 1000 *   into #temp
                                                        from     [CarVehicleData_tbl]