最近做的一个项目涉及到大数据量的数据表查询。数据表总量在7亿-20亿左右,以主键建立全局唯一索引,分区策略是hash分区+范围分区,很大部分情况下查询条件命中记录数超过万条,单次返回前XX条记录。在调优过程中总结出以下经验:
(1)在业务规则允许的情况下,尽量减少区间限制条件,即便该属性是索引字段。如:DATE>=min AND DATA <= max。如果有区间限制条件,会将所有记录与限制条件逐一比较,如果记录数较大,则会严重影响查询效率。
(2)使用order by排序尽量保证与索引顺序一致,oracle在建立索引的时候会默认以升序排序,order by规则与索引建立顺序一致的话则不会再单独进行排序操作
(3)如果查询条件均在索引范围,可考虑先搜索索引的rowid,通过rowid回表获取数据。该方法的好处是尽量减少回表访问。需要注意的是,该方法适合返回数据量较小的情况,如翻页记录等。
目前还存在多hash分区数据访问排序效率很慢的问题,还在解决中,待续!!!!
(4)在查询总记录条数时,建议sql写法为SELECT COUNT(1) FROM TABLE_NAME WHERE [OPTION CONDITION...]。若查询条件均为索引字段,这样写的好处是不用进行回表操作,直接查找索引获得结果。