为1.7亿张记录表创建快速索引
2007-05-10 12:16:25 来源:WEB开发网核心提示: 5)重复3,4两步,为1.7亿张记录表创建快速索引(4),估计这个是创建一个分区的索引需要解释一下的是,上面的sql只是我随机抓到的运行时间比较长的,SQL> Analyze index IDX_SUBMIT_RECORDTIME estimate statistics;Index
5)重复3,4两步,估计这个是创建一个分区的索引
需要解释一下的是,上面的sql只是我随机抓到的运行时间比较长的,整个create index过程会复杂很多,具体怎么样可以用sqltrace跟踪。这里主要看的是temp表空间的使用情况。
同时,在创建的过程中:
SQL> select segment_name,partition_name from user_segments where segment_name='IDX_SUBMIT_RECORDTIME';no rows selectedSQL> select index_name,partition_name from user_ind_partitions where INDEX_NAME='IDX_SUBMIT_RECORDTIME';no rows selected
当时忘了查user_segments中其实是有一个segment_name为一串数字的记录,那个才是正在创建的索引;如果这个事务失败了,将回滚。
最后耗时99分钟完成。
5. 创建完成后分析索引
但是接下来还有一件事。创建完成后要分析索引,否则就是走了索引,查询也巨慢无比。
SQL> explain plan for select count(*) from stat_submit_center where recordtime>trunc(sysdate);Explained.SQL> @?/rdbms/admin/utlxplp.sqlPLAN_TABLE_OUTPUT-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |-------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 9 | 4 | | || 1 | SORT AGGREGATE | | 1 | 9 | | | || 2 | PARTITION RANGE ALL | | | | | 1 | 50 ||* 3 | INDEX FAST FULL SCAN| IDX_SUBMIT_RECORDTIME | 8878K| 76M| 4 | 1 | 50 |-------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------3 - filter("STAT_SUBMIT_CENTER"."RECORDTIME">TRUNC(SYSDATE@!))Note: cpu costing is off16 rows selected.SQL> set autotrace on explainSQL> set timing onSQL> select count(*) from stat_submit_center where recordtime>trunc(sysdate);aa^Cselect count(*) from stat_submit_center where recordtime>trunc(sysdate)*ERROR at line 1:ORA-01013: user requested cancel of current operationElapsed: 00:11:49.85SQL>SQL> set autotrace off
上面可以看到,因为没有分析索引,虽然它走的是新建的IDX_SUBMIT_RECORDTIME这个索引,但是查询巨慢,10分钟后也没有结果。下面我们分析一下。
SQL> Analyze index IDX_SUBMIT_RECORDTIME estimate statistics;Index analyzed.Elapsed: 00:00:06.84SQL> set autotrace on explainSQL> select count(*) from stat_submit_center where recordtime>trunc(sysdate);COUNT(*)----------926736Elapsed: 00:00:05.37Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4360 Card=1 Bytes=9)1 0 SORT (AGGREGATE)2 1 PARTITION RANGE (ALL)3 2 INDEX (RANGE SCAN) OF 'IDX_SUBMIT_RECORDTIME' (NON-UNIQUE) (Cost=4360 Card=8878740 Bytes=79908660)SQL> set autotrace off
索引分析之后,查询时间在5分钟,效率大大提高。
更多精彩
赞助商链接