|
今天早上看,select /*+ use_nl(a b)*/ ... 花了7小时56分钟执行完,这个不算慢了,在预料之中的,因为nested loop是基本上是随机读。
今天试验重排记录后的效果,因为数据库空间不太够,先处理6月份的数据,这个当初没优化处理大概一个半小时。按user_name,start_time排序,再按这个生成索引,执行NL查询,发现NL查询看不到进度,也看不到trace的统计,结果是5分13秒就出来了。下一步准备再看11月份结果会如何。执行计划如下:
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 108 | 30M|
|* 1 | FILTER | | | | |
| 2 | SORT GROUP BY NOSORT | | 1 | 108 | 30M|
|* 3 | TABLE ACCESS BY INDEX ROWID | ADSL06_DETAIL | 1 | 54 | 2 |
| 4 | NESTED LOOPS | | 1 | 108 | 30M|
| 5 | TABLE ACCESS BY INDEX ROWID| ADSL06_DETAIL | 15M| 777M| 826 |
| 6 | INDEX FULL SCAN | A06_USER_NAME_AND_START_TIME | 15M| | 26 |
|* 7 | INDEX RANGE SCAN | A06_USER_NAME_AND_START_TIME | 1 | | 1 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(COUNT(*)<>0)
3 - filter("A"."NAS_IP"="B"."NAS_IP" AND "A"."NAS_PORT"="B"."NAS_PORT" AND "A"."FRAME_IP"<>
"B"."FRAME_IP"
7 - access("A"."USER_NAME"="B"."USER_NAME" AND "A"."START_TIME"<"B"."START_TIME" AND "B"."S
TART_TIME"<"A"."STOP_TIME"-.003472222222222222222222222222222222222222
这个执行计划次序正合我意。
然后看总共花的时间:
原始user_name,start_time索引生成时间,忘记了,应该不会太长。
按user_name,start_time排序倒入另一个表:3分46秒
再生成user_name,start_time索引时间:2分23秒
最后查询时间:5分13秒
合计估算从单纯的原始数据到最后结果大概刚好在15分钟之内。表的大小估计是800MB。 |
|