日期:2014-05-16  浏览次数:20545 次

表变量和临时表

表变量存储在内存中,而临时表存储在tempdb中,会涉及到物理IO读写,那么我们是否可以由此得出结论,使用表变量要比使用临时表效率高呢?相信有一部分人会和我有同样的想法,使用表变量的效率高,真是如此吗?先从一次优化存储过程的经历说起。

????? 存储过程涉及到两个表,一个是用户今日积分表@tableUserScore(数据源来自用户积分详情表中的今日数据),一个是用户积分统计表 UserScoreSum,该存储过程逻辑就是统计@tableUserScore中用户不同原因的积分值,生成到表UserScoreSum中。数据量 不算很大,@tableUserScore中大概40万条,但这个存储过程执行时间却有些惊人,通常都在1个小时之上。优化的最终结果是将表变量@tabeUserScore换成了临时表#tableUserScore,并在userid和reason上添加了联合索引,优化的效果是执行时间控制在了40S左右。临时表和表变量效率相差百倍,这次优化经历让我对临时表和表变量有了重新认识,也有了一连串的疑问,它们是如何存储的,效率如何,如何选用?

复制代码
declare@tableUserScoretable(
userid
int, --用户编号
name varchar(10), --用户姓名
reason varchar(32), --积分原因
score int--积分值
)

createtable UserScoreSum(
userid
int, --用户编号
name varchar(10), --用户姓名
createTime datetime, --时间
reason1Score int, --原因1积分值
reason2Score int, --原因2积分值
reason3Score int, --原因3积分值
reason4Score