1.1.1. 简介

临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,SqlServer的临时表存储在tempdb中,当不再使用时会自动删除。

定义临时表可采用如下两种方式。

第一:声明变量的方式,例如:

DECLARE@T1 table(ProjectNo int,xl_Pipe nvarchar(200));

第二:直接插入的方式,例如:

selecttableSum.o_projectno,tableSum.o_projectname,
cast((casewhen (tableA.Resul is null)then 0.00 else tableA.Resul end)as decimal(18,2))
into#temp1
from
(
select o_projectno,o_projectname from CDMS_Project
whereo_parentno <> 0 and o_type='P'
) astableSum

我们可以通过以上两种方式构建临时表。但是在采用第二种方式时,对不再使用的临时表需要删除掉,使用drop语句进行删除。例如:

droptable #temp1

1.1.2. 应用场景

临时表主要应用于sql查询语句,使用它能优化性能。在工程项目管理系统中,需要对大量的数据进行汇总、分类、求和等方式的处理,并生成各类报表或图表。采用传统的表连接进行查询,一般一个sql查询语句就会耗时30多秒,因此我们需要对sql查询做性能优化,在此我们可以使用临时表。另外,在以下场景中,我们也可以使用临时表。

(1).   当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。

(2).   程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的。

1.1.3. 应用示例

在项目的开发过程中,往往会遇到sql语句查询效率过低的问题,这时我们可以采用临时表进行优化。在工程项目管理系统中,大部分的报表及指标数据的查询都使用了临时表,下面以工程范围信息汇总表的SQL语句作为案例,阐述在具体问题上临时表的应用。 关键步骤如下:(完整的sql语句可见工程项目管理系统源代码中的sql语句)

①   声明临时表

DECLARE@T2 table(ProjectNo int,xl_Pressure nvarchar(200)); -- 压力

②   给临时表赋值     

insertinto @T2 (ProjectNo,xl_Pressure)
selecta.ProjectNo,b.xl_Pressure from
(SELECTo_parentno as ProjectNo,o_projectno as TenderID FROM CDMS_Project
whereo_type = 'TS') as a

③    临时表的应用

select* from
(
SELECTB.ProjectNo,LEFT(UserList,LEN(UserList)-1) as xl_Pressure
FROM 
(
SELECT ProjectNo, (SELECT xl_Pressure+'\' FROM @T2 WHERE ProjectNo=A.ProjectNo FOR XML PATH('')) AS UserList
FROM @T2 A GROUP BY projectno
)  B
) ash on h.ProjectNo = A.o_projectno

1.1.4. 取得的成果

通过使用临时表,使sql查询执行时间都从原来的13秒、9秒减少到3秒和5秒,性能得到了提高,而内存消耗有了小幅度的提高,但并不影响系统的性能。使用临时表使SQL语句整体结构性增强,增强SQL语句的可读性。

1.1.5. 存在问题及改进

在应用临时表是应该充分考虑对内存的消耗,以便对系统的性能不会造成影响。