最近遇到一个大表,数据行数在7亿行,13列。关键列有人员编号、项目编号、金额、批号、项目应支年月、项目实支年月。该表中大约95%的数据批号都是有值的。
大约3000W行批号为空的数据,且每月系统都会产生项目应支年月为当前年月的数据,大约900W行,批号为空;每月会办理的一项关键业务是将应支年月为当前年月的
数据打上批号(也会有一些应支年月为当前年月之前的也需要打上),也就是在3000W批号为空的数据中取,其中不到1000W的数据。
表中人员大约有50W人,项目编号总共有100多项,年月从200601开始到现在,项目应支年月在数据插入时就会写入,且不会被修改,项目实支年月会跟随批号同时写
入。取批号为空的数据时,会根据出途径不同分为10多个批次取数(不同途径的人数不同,最大的一种途径有15w人,小的只有1000人左右)。
以上是背景。
为能快速取出批号为空的数据,在表上建立了批号的索引(nvl(ph, 0)),人员编号的索引。
在实际使用中,发现大的支出途径使用批号的索引比较快,小的支出途径使用人员编号的索引比较快;后来尝试在批号上建立空与非空的索引,效果也不好。最终优
化的方案为将此表拆为两个表:批号空的一个表(大约3000W数据),非空的一个表(大约6亿7万)。每次取数时,从批号空的表中取数。定期将打上批号的数据挪到
另一个表中。虽然这样优化带来了很多代码修改的问题,但速度问题却得到了根本解决。
想请教问题,1、为什么大的支出途径使用批号的索引比较快,小的支出途径使用人员编号的索引比较快?
2、oracle分区使用的场景是什么?基本原理是怎样的?最好能有官方说明
3、分区与拆分表与的区别,为什么拆分表的方式比分区效果更好?
多谢