原帖《请问表里面有4亿条数据,如果做优化?》 http://topic.csdn.net/u/20110304/19/20f1737d-74ce-4546-9273-5861a022c301.html 问题: 数据库版本是db2 9.7。 表出入口T_CRK,数据量为4亿,并且每月都增加几百万。 结构大致如下: ID 主键 CRRQ 日期 PLACE 地点 XNAME 姓名 .... 还有其他的字段,但主要是这几个字段,查询的时候也一般是按照这几个条件查询,其中,日期是必选的查询条件,用户可以选择某一天也可以是某个时间段。姓名用户希望是模糊查询,地点总共有200个。 我是这样做的优化: 1、把原来的表改成分区表。按照日期的年份分区,既 一年 的数据是一个分区。 2、在日期上建立索引。后来想在日期上建立一个分区索引,一查才知道 db2 9.7 默认建立的就是分区索引。 3、在地点、姓名上建立了索引。 现在,查询条件为 等于某个日期的时候效率很高(<2s)。但是如果是一个时间段(一个月,一个月大约为几百万数据),就很慢,大约得1-2分钟。 如果在加上地点、姓名那就更慢了。最要命的是用户要求姓名模糊查询。 请大家指点一下。多谢!! 思路A: 中国人的姓名没几个字,人家想模糊查询,不如你加个字段,把关键的东西放进去,再给这个字段编个索引,界面上用户虽然用的是模糊,我们在后台把关键字拿出来用 = 而不是 like 去查索引。 思路B: 以2个月为单位建立分表 相当于数据归档 把当天的数据放在一张表临时表中,便于客户查询 建立索引 尽量在 where字句后加条件 注意从后往前过滤 思路C: 设计的时候就该给用户一个唯一ID,用ID号匹配,但是这个ID不是自增,可用一个分表记录ID号,方便迁移。 思路D: 综合下先建立表结构逻辑模型: 通过使用数据仓库建模思想建立星型模型: 1事实表 ID 主键 CRRQ_ID 日期ID PLACE_ID 地点ID XNAME_ID 姓名ID XX 事实字段 2日期维表 CRRQ_ID 日期ID CRRQ 日期 3地点维表 PLACE_ID 地点ID PLACE 地点 4客户维表 XNAME_ID 姓名ID XNAME 姓名 再利用DB2数据库的物理优化方法: 对事实表 1 数据库分区 2 表分区 3 建立MDC 4 建立 MQT 5 对联合主键建立位图索引 这样完全可以达到需求,4亿条数据的事实表在数据仓库中只能算小表