日期:2014-05-18  浏览次数:20684 次

在什么情况下使用临时表效率最高
场景描述:
  在每一次考试后,进行成绩计算,其中存在以下情况。在输入单科成绩保存到单科成绩表中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,而不使用临时表和表变量。