把大表都分了区,可是存储过程的速度还是没有提升,不解,没建全局索引可能是其中的原因之一
我的存储过程是这样的:
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读取的速度是相对快的,所以我想会不会是写入慢
另外...其他业务繁忙的时候会影响这个过程的操作....
11 个解决方案
#1
没试过,楼主可以试下,然后用explain plan 或者autotrace 分析下你的SQL就比较出来了,
#2
explain plan我是每一句都看过了,
autotrace 我实在是孤陋寡闻...没听过,回头试试
刚刚试了下,表分区以后不可以做全局索引...郁闷...
希望求证一下是不是说做了表分区就不能做全局索引,做全局索引就没必要做表分区?貌似要达到的效果都是相同的,二者有点重复的味道,就是表分区的话,数据分开存,全局索引就好像是纵向的索引方式
autotrace 我实在是孤陋寡闻...没听过,回头试试
刚刚试了下,表分区以后不可以做全局索引...郁闷...
希望求证一下是不是说做了表分区就不能做全局索引,做全局索引就没必要做表分区?貌似要达到的效果都是相同的,二者有点重复的味道,就是表分区的话,数据分开存,全局索引就好像是纵向的索引方式
#3
随便问一下,能不能把我的存储过程分析一下,像看explain plan一样,告诉我哪里快哪里慢?
#4
刚查了点资料,分区后确实不能做全局索引了.. 楼主看explian plan的时候,sql是做全表扫描的还是走索引的?
索引也可以进行分区,分区索引有两种类型:global 和local。
对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可 以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。
Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。
全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引
Oracle的分区功能十分强大。不过用起来发现有两点不大方便:
第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。
第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。
索引也可以进行分区,分区索引有两种类型:global 和local。
对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可 以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。
Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。
全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引
Oracle的分区功能十分强大。不过用起来发现有两点不大方便:
第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。
第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。
#5
如果在SQL上没有办法提高性能的话就只能从硬件上进行提高了,我们公司前段时间上线的系统就是,在DELL 2950服务器上跑 性能就是不行,最后换了服务器,DELL R710, 72G内存,现在性能超好...
我们的生产库里最大的表有600多万条,也是分区表....
我们的生产库里最大的表有600多万条,也是分区表....
#6
基本上看explian plan都是说走索引的,成本不能再低(相对来说我感觉很低,不过不知道真正把表分区发挥起来会不会更低)的样子
我的也是DELL 2950,4G,程序实际就用了1.4G左右的内存,CPU一共4个核,也没用得很满,我也纳闷不知道怎么,我的项目也没大到你那级别,就是开单审核的要求比较高
上面我所说的过程一个产品记录就要300毫秒左右,一个单据下去8、90个产品,就要快20秒,客户希望是10秒内完成,我觉得问题是可以解决的,就是没找对方法
我的也是DELL 2950,4G,程序实际就用了1.4G左右的内存,CPU一共4个核,也没用得很满,我也纳闷不知道怎么,我的项目也没大到你那级别,就是开单审核的要求比较高
上面我所说的过程一个产品记录就要300毫秒左右,一个单据下去8、90个产品,就要快20秒,客户希望是10秒内完成,我觉得问题是可以解决的,就是没找对方法
#7
索引也不是特别多,不造成写入的延误
#8
至于说繁忙时段更慢,我看了一下top sql,“每次运行的磁盘读取数”基本上都没有超过10000的数字,都是7000-6000的比较多,不知道会不会影响读写速度
对top sql上的数据没有什么参考准则,也看不出影响有多大
对top sql上的数据没有什么参考准则,也看不出影响有多大
#9
global index 一般要快.
但是你要考虑可用性.
但是你要考虑可用性.
#10
分区的好处,一个是在大数据量查询中可以通过分区消除(避免表扫描)来提高速度,一个是高并发度的增删改中,可以分散锁和I/O的压力,在多个设备和块上插入。
像你这样,一个产品记录仅0.3秒的,本来I/O就不多,可能分区这个方法助益不大,我感觉多建立一个合适的索引可能会解决你的问题。
另外,“一个单据下去8、90个产品”看来楼主是一条条单身顺序处理的,如果改成批量处理---整个单据90条单身用一句SQL来处理,可能会大有改观。
个人感觉,希望能对你有所帮助。
#11
1.用并行 parallel
2.表分区要将分区放在不同的tablespace的Datafile中
3、建立分区索引
2.表分区要将分区放在不同的tablespace的Datafile中
3、建立分区索引
#1
没试过,楼主可以试下,然后用explain plan 或者autotrace 分析下你的SQL就比较出来了,
#2
explain plan我是每一句都看过了,
autotrace 我实在是孤陋寡闻...没听过,回头试试
刚刚试了下,表分区以后不可以做全局索引...郁闷...
希望求证一下是不是说做了表分区就不能做全局索引,做全局索引就没必要做表分区?貌似要达到的效果都是相同的,二者有点重复的味道,就是表分区的话,数据分开存,全局索引就好像是纵向的索引方式
autotrace 我实在是孤陋寡闻...没听过,回头试试
刚刚试了下,表分区以后不可以做全局索引...郁闷...
希望求证一下是不是说做了表分区就不能做全局索引,做全局索引就没必要做表分区?貌似要达到的效果都是相同的,二者有点重复的味道,就是表分区的话,数据分开存,全局索引就好像是纵向的索引方式
#3
随便问一下,能不能把我的存储过程分析一下,像看explain plan一样,告诉我哪里快哪里慢?
#4
刚查了点资料,分区后确实不能做全局索引了.. 楼主看explian plan的时候,sql是做全表扫描的还是走索引的?
索引也可以进行分区,分区索引有两种类型:global 和local。
对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可 以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。
Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。
全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引
Oracle的分区功能十分强大。不过用起来发现有两点不大方便:
第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。
第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。
索引也可以进行分区,分区索引有两种类型:global 和local。
对于local索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由Oracle自动进行。对于global索引,可 以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后 REBUILD。
Oracle9i提供了UPDATE GLOBAL INDEXES语句,可以使在进行分区维护的同时重建全局索引。
全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引
Oracle的分区功能十分强大。不过用起来发现有两点不大方便:
第一是已经存在的表没有方法可以直接转化为分区表。不过Oracle提供了在线重定义表的功能,可以通过这种方式来完成普通表到分区表的转化。
第二点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。
#5
如果在SQL上没有办法提高性能的话就只能从硬件上进行提高了,我们公司前段时间上线的系统就是,在DELL 2950服务器上跑 性能就是不行,最后换了服务器,DELL R710, 72G内存,现在性能超好...
我们的生产库里最大的表有600多万条,也是分区表....
我们的生产库里最大的表有600多万条,也是分区表....
#6
基本上看explian plan都是说走索引的,成本不能再低(相对来说我感觉很低,不过不知道真正把表分区发挥起来会不会更低)的样子
我的也是DELL 2950,4G,程序实际就用了1.4G左右的内存,CPU一共4个核,也没用得很满,我也纳闷不知道怎么,我的项目也没大到你那级别,就是开单审核的要求比较高
上面我所说的过程一个产品记录就要300毫秒左右,一个单据下去8、90个产品,就要快20秒,客户希望是10秒内完成,我觉得问题是可以解决的,就是没找对方法
我的也是DELL 2950,4G,程序实际就用了1.4G左右的内存,CPU一共4个核,也没用得很满,我也纳闷不知道怎么,我的项目也没大到你那级别,就是开单审核的要求比较高
上面我所说的过程一个产品记录就要300毫秒左右,一个单据下去8、90个产品,就要快20秒,客户希望是10秒内完成,我觉得问题是可以解决的,就是没找对方法
#7
索引也不是特别多,不造成写入的延误
#8
至于说繁忙时段更慢,我看了一下top sql,“每次运行的磁盘读取数”基本上都没有超过10000的数字,都是7000-6000的比较多,不知道会不会影响读写速度
对top sql上的数据没有什么参考准则,也看不出影响有多大
对top sql上的数据没有什么参考准则,也看不出影响有多大
#9
global index 一般要快.
但是你要考虑可用性.
但是你要考虑可用性.
#10
分区的好处,一个是在大数据量查询中可以通过分区消除(避免表扫描)来提高速度,一个是高并发度的增删改中,可以分散锁和I/O的压力,在多个设备和块上插入。
像你这样,一个产品记录仅0.3秒的,本来I/O就不多,可能分区这个方法助益不大,我感觉多建立一个合适的索引可能会解决你的问题。
另外,“一个单据下去8、90个产品”看来楼主是一条条单身顺序处理的,如果改成批量处理---整个单据90条单身用一句SQL来处理,可能会大有改观。
个人感觉,希望能对你有所帮助。
#11
1.用并行 parallel
2.表分区要将分区放在不同的tablespace的Datafile中
3、建立分区索引
2.表分区要将分区放在不同的tablespace的Datafile中
3、建立分区索引