按照一般的做法(重命名表名,建立可以分区的表,将原表拆分,替换成分区)
把大表都分了区,可是存储过程的速度还是没有提升,不解,没建全局索引可能是其中的原因之一我的存储过程是这样的:
1.将A主表跟A从表的记录insert到B主表跟B从表(当中计算忽略)
2.将B主表跟B从表的记录insert到C主表跟C从表(当中计算忽略)
3.根据C从表的(当前处理单据的)每项记录,分别查询D表记录(得到各自ID号最大的一条记录R)
4.根据记录R作为基础,计算一下,然后各自insert一条记录到D表A的表比较小没管了
B跟C的从表、还有D都比较大(两百多万条记录),所以都分表了,
索引按照平常的做法从新建了,并不是全局索引目前的状况没好转,也不知道读慢还是写慢...记录R读取的速度是相对快的,所以我想会不会是写入慢另外...其他业务繁忙的时候会影响这个过程的操作....
把大表都分了区,可是存储过程的速度还是没有提升,不解,没建全局索引可能是其中的原因之一我的存储过程是这样的:
1.将A主表跟A从表的记录insert到B主表跟B从表(当中计算忽略)
2.将B主表跟B从表的记录insert到C主表跟C从表(当中计算忽略)
3.根据C从表的(当前处理单据的)每项记录,分别查询D表记录(得到各自ID号最大的一条记录R)
4.根据记录R作为基础,计算一下,然后各自insert一条记录到D表A的表比较小没管了
B跟C的从表、还有D都比较大(两百多万条记录),所以都分表了,
索引按照平常的做法从新建了,并不是全局索引目前的状况没好转,也不知道读慢还是写慢...记录R读取的速度是相对快的,所以我想会不会是写入慢另外...其他业务繁忙的时候会影响这个过程的操作....
没试过,楼主可以试下,然后用explain plan 或者autotrace 分析下你的SQL就比较出来了,
autotrace 我实在是孤陋寡闻...没听过,回头试试刚刚试了下,表分区以后不可以做全局索引...郁闷...希望求证一下是不是说做了表分区就不能做全局索引,做全局索引就没必要做表分区?貌似要达到的效果都是相同的,二者有点重复的味道,就是表分区的话,数据分开存,全局索引就好像是纵向的索引方式
索引也可以进行分区,分区索引有两种类型:global 和local。
对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可 以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。
全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快 注意:不能为散列分区 或者 子分区创建全局索引 Oracle的分区功能十分强大。不过用起来发现有两点不大方便:
第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。
第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。
分区的好处,一个是在大数据量查询中可以通过分区消除(避免表扫描)来提高速度,一个是高并发度的增删改中,可以分散锁和I/O的压力,在多个设备和块上插入。
像你这样,一个产品记录仅0.3秒的,本来I/O就不多,可能分区这个方法助益不大,我感觉多建立一个合适的索引可能会解决你的问题。
另外,“一个单据下去8、90个产品”看来楼主是一条条单身顺序处理的,如果改成批量处理---整个单据90条单身用一句SQL来处理,可能会大有改观。
个人感觉,希望能对你有所帮助。