首先申明,我对robbin是大大的崇拜,发这个帖子没有任何的其他目的
场景:我们项目中有一个文件上传表,我记得robbin曾经说过javaeye论坛有一个闪光的设计就是将每个帖子的大字段context单独放在一个表中,topic和context关联,这样可以提高性能,我记得有一个论点就是:数据库真正的压力在I/O的吞吐上,topic表这样变小了,在查询时性能会提升,当需要看topic内容的时候,再去context表中获取帖子的内容。
现在我在项目中也想将文件上传表采用这样的分离设计。但需要说服我们的项目领导。他提出,一张File表虽然同时存了FileContext字段,但在file列表查询的时候只要发送"select fileId,fileName from uploadFiles"这样的SQL,并没有查询FileCOntext这个大字段,所以不会带来性能影响。
我自己作了一个简单的测试,在表中insert了2000记录,每条File的FileContext都insert了一个5M的文件,在执行"select fileId,fileName from uploadFiles"好像真的没有变慢。
想请各位大牛指点一下!!!万分感谢,我数据库是SQLSERVER2005,hibernate是3.2.5。
问题补充:
刚才有朋友在留言板回答是为了防止 “select ×”之类的查询,但是我完全可以通过HQL只查询fileId和fileName啊。我想这不应该是robbin提倡这样设计的原因吧
不太清楚robbin是不是真的发表过类似的观点,不过这确实是有一定道理的。但是你的思路偏了,因为开销并不是损失在取不取字段这个问题上。
一般来说,如果一个表里的字段都是定长的(没有varchar、text等字段),那么数据库在读取一条记录的时候就会按照固定长度读取,一次索引读,一次数据读就可以了。如果一条记录是变长的,那数据库首先需要取得行长,然后才能取数据,这要浪费一次物理读。一般大字段的读取概率相对不高,而每一次不需要大字段的读取却要浪费一次物理读。
当然,可能有一些数据库的实现原理不是这样的,那就没有这个问题了。这里是MySQL的MyISAM存储引擎的说明:http://dev.mysql.com/doc/refman/5.1/en/myisam-table-formats.html,请参考《13.5.3.1. Static (Fixed-Length) Table Characteristics》和《13.5.3.2. Dynamic Table Characteristics》。
同问
不过觉得你的测试不太全面