日期:2014-5-19 浏览次数:21288次

考考大家一个问题,请进.
两个表.

tb1(五千万条记录)
zkzh --准考证号, 
th --题号
da --考生答案

tb2(100条记录)
th --题号
da --标准答案
fs --分数

tb1:zkzh + th 主键
tb2:th 主键
两表目前除主键无其他索引.

现在问:要得到每个考生每个题所得的分数.
条件 tb1.th = tb2.th and tb1.da = tb2.da
如果才能最快(或者较快)得到结果.

以下是两钟方案
方案一:
在tb1,加个字段fs,默认为0
update tb1 set fs = tb2.fs from tb1 , tb2 where tb1.th = tb2.th and tb1.da = tb2.da

方案二:
新建一个表,tb3 (zkzh , th , da , fs)
insert into tb3 select m.* , case when tb1.da = tb2.da then tb2.fs else 0 end from tb1 , tb2 , where tb1.th = tb2.th 

各位观众认为那个方案好.或者有更好的其他方案.


------解决方案--------------------
俺觉得一次性的话第二个好,以后经常用的话第一个好,可以改计算列或者触发器吧
------解决方案--------------------
如果5000万记录尚未产生,当然用方案1
如果记录已存在,需测试决定,对一个5000万条记录的表添加一个字段能比复制一个表更快,需测试才知道.
复制往往比更新大量数据更快.

建议lz测一测,将结果帖出来!
------解决方案--------------------
估计现在是数据已经进去了,来补成绩的吧


不好说哪个快,如果引起页面数据搬家,你还是搞一个新表吧


------解决方案--------------------
如果已经存在了5000万条数据,建议用第二种方案.
如果只是前期设计,那还是用第一种吧.
------解决方案--------------------
个人觉得选择二

方案二:
新建一个表,tb3 (zkzh , th , da , fs)
insert into tb3 select m.* , case when tb1.da = tb2.da then tb2.fs else 0 end from tb1 , tb2 , where tb1.th = tb2.th

这查询速度更快。
------解决方案--------------------
第2个吧
------解决方案--------------------
在已有数据的情况下,ms第二个好些。
------解决方案--------------------
update 比 insert不知道慢多少倍

------解决方案--------------------
to 乌龟:
如果是要修改表的结构,我觉得用第二种。如果里面有数据的话,修改表所引起的开销会非常大。这个是要考虑进去的
------解决方案--------------------
我觉得应该是第二种,
方案二:
新建一个表,tb3 (zkzh , th , da , fs)
insert into tb3 select m.* , case when tb1.da = tb2.da then tb2.fs else 0 end from tb1 , tb2 , where tb1.th = tb2.th