在什么情况下使用临时表效率最高
场景描述:
在每一次考试后,进行成绩计算,其中存在以下情况。在输入单科成绩保存到单科成绩表中Point(几百万条,以后会不断持续增长),单次考试插入单科记录总计大约20000条。
现在为了进行一步计算各个学生的语数英,语数英物理化考试分数总和情况.
表结构描述:
Point学生单科成绩表
testId gradeId subjectId studentId point
1 一年级 语文 学生1 91
1 一年级 语文 学生2 92
1 一年级 语文 学生3 93
1 一年级 语文 学生4 94
1 一年级 语文 学生5 95
1 一年级 语文 学生6 96
allocateSumPointType总分类型表
gradeId sumPointTypeId sumPointTypeName
一年级 1 语数英
一年级 2 语数英物化生
一年级 3 语数英物化生政史地
allocateSumPointTypeSubject 总分类型科目表
sumPointTypeId subjectId weighting
1 语文 0.3
1 数学 0.3
1 英语 0.4
2 语文
2 数学
2 英语
2 物理
2 化学
2 生物
3 语文
3 数学
3 英语
3 物理
3 化学
3 地理
3 历史
3 政治
问题描述:
在使用存储过程进行指定科目总分时,我是需要将20000记录插入到临时表中,然后临时表作为后续计算的关联表好,还是直接使用HSL_Point进行关联好。
进一步探讨:
临时表和表变量使用的界点是什么。表变量在操作少部分数据量的时候速度快(按我的看法是最好只有几百条一下)。
------解决方案--------------------表变量 没索引,最多只有一个主键,记录多了,效率肯定高不了
------解决方案--------------------
小数据量用表变量 大数据量用临时表
而且表变量中是用不了索引了
临时表可以使用索引
------解决方案--------------------
当你需关联的表很多,但从每个表中取的列确很少时,且数据量很大时,
用临时表单独更新一些列,然后直接从更新后的临时表取数据,其效率要比你用表关联查询快很多
------解决方案--------------------
当一些查询中多次用到同一个子查询时,可以使用临时表。
------解决方案--------------------数据量大小这个根本没有一个标准,10年前,10万数据的表就被成为大表,而现在,10亿叫做大表还差不多。如果非要给出一个定量值,按我的经验,对于数千条数据以上,就不建议使用表变量了。特别是你这个数据集要和大数据量的表关联的时候,有索引会更好。
另外,如果为了实现一些迭代,可以使用CTE,而不使用临时表和表变量。