关于大表如何设计,如何处理

[复制链接]
查看11 | 回复9 | 2011-11-1 16:26:29 | 显示全部楼层 |阅读模式
一张业务主表,包含有50个字段。
在查询的时候这50个字段都会成为过滤条件。
那么每次都需要将这个大表的50个字段进行条件的比对得到结果集。

但是其中的10个字段是在判断权限的时候非常常用的字段。如果每次都用这50个字段来进行常用的权限判断操作。效率应该会低一些。
考虑是不是可以将这张大表拆成两张小表,一张为10个字段,一张为40个字段。
这样在常用操作的时候会很合适,但是在查询的时候,要关联两张表进行过滤。
同时在update和insert的时候,都要去修改两张表。
这样不知道是否合适啊?
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
就楼主的描述,我认为合适。
update和insert时修改两张表,这个问题不大,因为都是by主键的。
主要看select,关键索引相关的字段必须在同一个表内即可。
比如select中应该有一些关键字段是查询时必不可少的,比如客户ID以及操作时间等,这两个信息如果查询时经常用到,而且建立索引能够明显提高效率的话,这2个字段就应该在一个表(常用小表)里,否则没法建立联合索引,而单个字段索引很可能效率地下的。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
另外,主表和从表可能都要分区(如果数据量大的话),切记分区键的取值各个表要一致,比如主表记录的创建时间是T1(插入记录时取的sysdate),其他从表的创建时间就应该取T1,而不是插入从表记录时的sysdate
呵呵,这是经验


回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
我们的系统 就是常用的数据在一个表里,少用的数据在另一个表里
两个表主键完全一致
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
分表以后,可以建试图把两个表合起来,试图上加上instead view,insert 和 update 到基表,这样旧的application不需要修改
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
举出一个“效率应该会低一些”的例子?
分表(垂直分区)是一种反规范化设计,仅当你经常全表扫描而且额外的40个列会明显增加扫描的块数才有意义。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
原帖由 newkid 于 2011-9-1 22:24 发表
举出一个“效率应该会低一些”的例子?
分表(垂直分区)是一种反规范化设计,仅当你经常全表扫描而且额外的40个列会明显增加扫描的块数才有意义。


比如说这张用户信息大表上有40个字段,然后每次查询列表数据的时候,只会用到其中的15个字段。
其余25个字段是在点击这个用户的详细信息时才去具体查询的。
所以在大部分操作的时候是可以不去操作这没有用到的25个数据的。
当然,在select的时候,肯定没有用select * 去查询,所有的40个字段。
就算是只SELECT 其中的15个字段,应该也会有很大的影响吧?
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
如果每次都是通过索引查单行或少数行,分表没有意义。
如果扫描的块数一样,从15个列的表中SELECT 15个字段,和从40个列的表中SELECT 15个字段,可以认为没有差别。理论上讲SELECT 靠前的列会更高效但实际的差别很难觉察。
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
newkid说的很好啊,一个表就ok了
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
原帖由 newkid 于 2011-9-5 22:32 发表
如果每次都是通过索引查单行或少数行,分表没有意义。
如果扫描的块数一样,从15个列的表中SELECT 15个字段,和从40个列的表中SELECT 15个字段,可以认为没有差别。理论上讲SELECT 靠前的列会更高效但实际的差别很难觉察。


3Q。。 这样的话,就是说表大一点也没有影响的,只要取的列少的话,也是一样的效果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行