因为数据抽取为了保证数据一致性,所以使用闪回查询的功能,所以这个问题为了方便排查,可以进一步把sql语句改写为:
select count(*) FROM "RATED_EVENT" "RATED_EVENT" WHERE "CUSTOMER_ID"=11727713
执行计划如下:
Plan hash value: 3695503463
但是根据自己的测试发现,效果并不理想。
如果要直接修改抽取的配置规则,相对也是比较困难的。如果能够提升抽取速度,同时能从抽取业务上做一些优化但不改变原有的业务就是最好的方法了。
明白了这点,自己就开始结合业务来进行分析,因为整个分区表是按照一个类似账期的字段来分区的,一个customer只对应一个账期,customer下的subscriber都是同一个账期,明白了这点。
语句就可以相应的修改成下面的形式。
select count(*) FROM "RATED_EVENT" "RATED_EVENT" WHERE "CUSTOMER_ID"=10566068 and
cycle_code in (select cycle_code from customer where customer_id=10566068)
这个时候执行计划也有了一些变化。
Plan hash value: 1017421008
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 9 | 73 (0)| 00:00:01 | | |
| 1 | SORT AGGREGATE | | 1 | 9 | | | | |
| 2 | PARTITION RANGE ITERATOR| | 303 | 2727 | 73 (0)| 00:00:01 | 241 | 481 |
|* 3 | INDEX RANGE SCAN | RATED_EVENT_1UQ | 303 | 2727 | 73 (0)| 00:00:01 | 241 | 481 |
-------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
3 - SEL$1 / RATED_EVENT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("CUSTOMER_ID"=10566068 AND "CYCLE_CODE"=2)
filter("CYCLE_CODE"=2)
可以看到这个时候扫描的分区少了很多,从241~481,相比原来只扫描了四分之一的分区。性能的提升还是很高的。