ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引对直接路径加载的影响

索引对直接路径加载的影响

原创 Linux操作系统 作者:wei-xh 时间:2011-12-30 12:37:20 0 删除 编辑
TEST表大小1,984M
 
-----------表上无索引,每次操作前flush buffer cache
flush buffer cache
insert /*+ append */ into test1 select * from test;
19999996 rows created.
Elapsed: 00:01:19.06
 
flush buffer cache
create index tt1 on test1(object_id);
Index created.
Elapsed: 00:00:51.82
 
flush buffer cache
create index tt2 on test1(object_type);
Index created.
Elapsed: 00:00:55.21
 
 
总共耗时:79+52+55=186。
 
 
---------------表上存在两个索引
flush buffer cache
insert /*+ append */ into test1 select * from test;
19999996 rows created.
Elapsed: 00:04:12.60
 
总共耗时:252秒
 
 
第一种方式比第二种方式快了66秒。
 
 
11GR2版本(之前的版本没有测试),是在数据加载完成后,创建的索引。
 
因为在创建的过程中,通过脚本@size查看段的大小:
1)表段的大小,一直在增大,增大到1,984M后,不再增大。整个过程中,两个索引段的大小没有变化。说明表的加载跟索引的加载是分开的。
2)表加载完成后,索引段的大小开始增大,先是TT2索引大小增大,然后是TT1索引。
 
用@showlong脚本查看,加载数据的整个过程:
1)先是Table Scan:  TEST.TEST: 36612 out of 382813 Blocks done
2)再是Sort/Merge:  : 10765 out of 78629 Blocks done
3)最后是Sort Output:  : 18293 out of 78601 Blocks done ,这个过程会出现两次。因为是两个索引。
SQL_ID             MESSAGE                                                                          TIME_REMAINING
------------------ -------------------------------------------------------------------------------- --------------
7dy0qdzzmq7k4      Sort Output:  : 13678 out of 68976 Blocks done                                               28
 
过程1是扫描表。过程2说不清楚。过程三是创建索引过程中的排序。
 
测试中发现_sort_multiblock_read_count不再有用。
alter session set "_sort_multiblock_read_count"=128;
Session altered.
 
后台观察到的P3参数direct path read temp一直是31
 
里面有一点需要思考:
我们最终的目的是想要把数据加载到表里,表包含两个索引。
第一种方式先加载了表数据后创建的索引
第二种方式在存在两索引表上直接加载数据,但是我们通过一些手段发现,ORACLE其实也是先加载了数据再创建的索引。跟第一种似乎没什么区别。但是时间上是有明显差异的。第一种比第一种快了不少。
 
实验过程中我发现,第二种方式,虽然加载数据过程中,索引的大小不变,但是temp表空间的使用一直在增加,产生了两个临时段:
sys@SMART>@temp
    SID SPID       USERNAME     MACHINE            LOGON_TIME          PROGRAM              EL_TIME
------- ---------- ------------ ------------------ ------------------- -------------------- -------------------------------------------
OPERATION_TYPE                           MB                                           SQL_ID
---------------------------------------- -------------------------------------------- ------------------
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
   2084 3959       TEST         dba-service-12     2011-12-31 14:58:01 sqlplus@dba-service- 141(s)
                                                                       12 (TNS V1-V3)
IDX MAINTENANCE (SOR                     540(MB)                                      7dy0qdzzmq7k4
insert /*+ append */ into test1 select * from test
   2084 3959       TEST         dba-service-12     2011-12-31 14:58:01 sqlplus@dba-service- 141(s)
                                                                       12 (TNS V1-V3)
IDX MAINTENANCE (SOR                     629(MB)                                      7dy0qdzzmq7k4
insert /*+ append */ into test1 select * from test
 
表数据加载完成后,开始读取临时段,创建索引
 
我个人的猜想第二种方式慢,主要是因为在加载表数据的过程中,需要对索引字段存入临时段,并且需要排序,并行的这两个操作:加载数据+写入临时段. 影响最终的加载速度。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-714235/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2285545