oracle简单性能优化

一、先介绍一下的SGA:的系统全局区,SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。

1、共享池又由两部分构成:共享 区和数据字典缓冲区。共享SQL区专门存放用户SQL命令,oracle使用最近最少使用等优先级算法来更新覆盖;数据字典缓冲区 (librarycache)存放数据库运行的动态信息。数据库运行一段时间后,DBA需要查看这些内存区域的命中率以从数据库角度对数据库性能调优。通 过执行下述语句查看:
select(sum(pins-reloads))/sum(pins)"LibCache" from v$librarycache;
--查看共享SQL区的重用率,最好在90%以上,否则需要增加共享池的大小。
select(sum(gets-getmisses-usage-fixED))/sum(gets)"RowCache" fromv$rowcache;
--查看数据字典缓冲区的命中率,最好在90%以上,否则需要增加共享池的大小。
2、 数据缓冲区:存放sql运行结果抓取到的doracle 结果排序atablock;
 SELECTname,value  FROMv$sysstat  WHEREnameIN('dbblockgets','consistentgets','physicalreads');
--查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1-(physicalreads/(dbblockgets+consistentgets))。命中率应该在90%以上,否则需要增加数据缓冲区的大小。
3、日志缓冲区:存放数据库运行生成的日志。
selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');
--查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率:申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。
二.Sql语句的执行步骤:
 了解sql的执行步骤有利于更好的优化它们,每条sql语句执行时都要经历以下几步:
1. Create cursor;
2. Parse,ifitisnotalreadyinthesharedpool.;
3. Anyqueryinthestatementisprocessed.
4. BindVariables 
5. Execute.
6. Ifpossible,thestatementisparallelized.
7. Rowstobereturnedarefetoracle优化提示ched.

其中,Parse—是最有优化潜力的阶段。
Cursor创建后,oracle将在sharepool中寻找是否该sql语句已经存在,若已经存在且已经被parsed,则不需要再执行parse,直接到下一步。若未在sharepool中找到,则parse步一般需要执行下面步骤:
1. Thestatementisvalidated.
2. Thedataisvalidated.
3. Locksareallocated.
4. Privilegesareverified.
5. Theexecutionplanisdetermined.
6. ThestatementisloadedintothesharedSQLarea.
--parse有这么多步骤,所以能利用sharepool中现成的parse结果很重要。

三.如何提高sharepool中Sql共享率?
要实现sql共享,跳过parse步骤,有如下基本要求条件:
1.sql文本完全相同:
--uppercase and lowercase
--whitespace(spaces,tabs,carriagereturns)
--comments
2.参考对象相同:
 --Referencedschema’sobjectsmustbethesameobjects
3.绑定变量相同
--Bindvariablesmustmatchthesamenameanddatatype.(所以对于格式相同、具体条件不同的sql,建议经常使用变量来代替常量,以尽量使用重复sql代码,避开parse阶段,提高执行速度)
--tip:
--尽量使用存储过程;尽量使用变量代替常量,可以提高sharepool共享率,跳过parse阶段,提高效率。
四.什么是好的sql语句?
总结出以下特征:
尽量使用PL/SQL提高性能:PL/SQL可以将sql语句块一次送给数据库服务器处理,不用PL/SQL只能一句一句送。
 尽量使用storedprocedure:降低oracle通过网络传输的数据量,并能提高共享sql区域的重用率。
尽量使用packages:Packages在第一次调用时能将整个包load进内存,对提高性能有帮助。
 尽量使用cachedsequences来生成primarykey:提高主键生成速度和使用性能。
 很好地利用空间:如用VARCHAR2数据类型代替CHAR等
 只在非常必要时才使用hint:仅在对sql的执行计划非常肯定地要使用hint时才使用。

五.Sql优化工具的介绍:
sqlexpert;toad;explain-table;PL/SQL;OEM等
掌握一种,熟练使用即可。
我的习惯:看执行计划用sqlplus的autotrace,优化用sqlexpert。

--Autotrace使用方法:
1.DBA在db中创建plustrace角色:运行@/sqlplus/admin/plustrce.sql
2.DBA给用户赋予角色:grantplustracetousername;
3. 用户创建自己的plan_table:运行@/rdbms/admin/utlxplan.sql。--以上是第一次使用时需要进行的必要操作。
4. 用户sqlplus连接数据库,对会话进行如下设置:
Set autotrace -----off/on/trace------explain/statistics,
然后录入sql语句回车即可查看执行计划—推荐;
或者用如下命令行:
Explainplansetstatement_id=’myplan1’  for  Yoursql-statement;
然后查看用户自己的plan_table

--演示Sql-expert的使用,连接到指定数据库,输入sql,显示执行计划或者sql优化结果,图形界面如下:

--ps:但我在使用中发现sql-expert的执行计划有时候显示得并不准确,所以建议以sqlplus中的为准。其sql优化倒很值得参考,有多种结果,用户可以自己和选择。

六.SQL优化技巧
在这方面,长期搞数据库应用开发的人应该更有经验,我这里大概总结一下自己遇到过的和搜集到的一些sql优化经验,跟大家共同。
SQL 语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率可能会很不相同的,生产系统里经常跑的sql语句更要注意执行效率,否则 会占用大量系统资源,带慢整个系统。SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,执行过程中访问尽量少的数据块,减 少表扫描的I/O次数,尽量避免全表扫描和其他额外开销。
Sql优化:
1、先介绍一下oracle数据库常用的两种优化 器:RBO(rule-based-optimizer)和CBO(cost-based-optimizer)。目前更多地采用CBO(cost- based-optimizer)基于开销的优化器。在CBO方式下,Oracle会根据表及索引的状态信息来选择计划;在RBO方式下,Oracle会 根据自己内部设置的一些规则来决定选择计划,例如oracle会根据以下优先级来选择执行计划(越靠前,rank越低,越快):


 RANKAccesspath
1ROWID等于常量
2唯一键值或主键的聚簇连接*
3唯一键值或主键的哈希聚簇连接* 
4整个复合索引等于常量
5唯一索引列等于常量
6完全聚簇键等于同一个聚簇上的另一个表对应的聚簇键*
7哈希聚簇键等于常数*
8完全聚簇键等于常数*
9整个非唯一组合索引等于常量
10非唯一索引连结
11整个组合索引等于小范围的值
12组合索引的大部分前面的列等于常量
13索引列取值存在上限和下限或者索引列LIKE"ABC%"(范围限制)
14非唯一索引列取值存在上限和下限或者索引列LIKE"ABC%"(范围限制)
15唯一索引列或是常量(范围无限制)
16非唯一索引列或是常(范围无限制)
17非索引列的等值连接(sort/mergejoin)
18单一索引列的最大或最小值
19ORDERBY整个索引
20全表扫描

2、创建索引:创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。
索引创建原则:
--在select操作占大部分的表上创建索引;
--在where子句中出现最频繁的列上创建索引;
--在选择性高的列上创建索引(补充索引选择性,最高是1,eg:primarykey)
--复合oracle下载索引的主列应该是最有选择性的和where限定条件最常用的列,并以此类推第二列……。
--小于5M的表,最好不要使用索引来查询,表越小,越适合用全表扫描。

索引使用原则:
--查询结果是所有数据行的5%以下时,使用index查询效果最好;
--where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当sql语句所查询的列,全部都出现在复合索引中时,此时由于Oracle只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;
--索引利于select,但对经常insert,delte尤其update的表,会降低效率。

eg:试比较下面两条SQL语句(emp表的deptno列上建有ununiqueindex):
语句A:SELECTdname,deptnoFROMdeptWHEREdeptnoNOoracle 排序TIN 
(SELECTdeptnoFROMemp);
语句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS
(SELECTdeptno FROMempWHEREdept.deptno=emp.deptno);
这 两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句 B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的 效率高。我的测试结果:(当emp表有37M时的测试):
SQL>SELECTdname,deptnoFROMdeptWHEREdeptnoNOTIN
(SELECTdeptnoFROMemp);
DNAME             DEPTNO
------------------------
OPERATIONS            40

Elapsed:00:00:01.08
ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=CHOOSE
oracle sql语句优化  1   0  FILTER
  2   1    TABLEACCESS(FULL)OF'DEPT'
  3   1    TABLEACCESS(FULL)OF'EMP'
Statistics
----------------------------------------------------------
         0 recursivecalls
        31 dbblockgets
      4635 consistentgets
         1 physicalreads
         0 redosize
       541 bytessentviaSQL*Nettoclient
      &nbsoracle 存储过程p;550 bytesreceivedviaSQL*Netfromclient
         2 SQL*Netroundtripsto/fromclient
         0 sorts(memory)
         0 sorts(disk)
1rowsprocessed
SQL>SELECTdname,deptnoFROMdeptWHERENOTEXISTS
(SELECTdeptno FROMempWHEREdept.deptno=emp.deptno);
DNAME             DEPTNO
------------------------
OPERATIONS            40

Elapsed:00:00:00.30

ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=CHOOSE
  1   0  FILTER
  2   1    TABLEACCESS(FULL)OF'DEPT'
  3   1    INDEX(RANGESCAN)OF'IND_EMP_DEPTNO'(NON-UNIQUE)

Statistics
----------------------------------------------------------
         0 recursivecalls
        12 dbblockgets
        19 consistentgets
         0 physicalreads
       144 redosize
       541 bytessentviaSQL*Nettoclient
       550 bytesreceivedviaSQL*Netfromclient
         2 SQL*Netroundtripsto/fromclient
         0 sorts(memory)
         0 sorts(disk)
         1 rowsprocessed

3.索引常用类型,按存储方式分为:B-tree,bitmap,reversekeyindex
 B-ree:最常用的一种,又可以分为primary,lunique,nonunique,composite,cluster等
 bitmap适用情况:l
--该列重复值很高(eg:性别列、分数列ABC级等),最好该列有notnull的限制;
--bitmap对大表效果好,且很节省索引空间;
--适合并发度低的表,因为其数据更新时会锁住整个bitmapblock;
--使用bitmap索引时,需要加hint强制使用(应该是oracle一个bug)
 Reverse索引:适用于序列生成的数字列,会将indexlkey列值倒序存放,尤其表的更改并发度又比较高时,更适合用reverse索引,这样可以将相似值的行分散到索引的多个叶子节点,降低冲突,提高性能。
根据应用需求在适当列建合适的索引。

4、 Oracle要使用一个索引,有一些基本要求条件:
----where子句中的这个字段,必须是复合索引的第一个字段;
eg:一个索引是按f1,f2,f3的次序建立的,若where子句是f2=:var2,则因为f2不是索引的第1个字段,无法使用该索引。
----where子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
---- 应尽量熟悉各种操作符对Oracle是否使用索引的影响:以下这些操作会显式(explicitly)地阻止Oracle使用索 引:isnull; isnotnull; notin; !=; like;numeric_col+0;date_col+0; char_col||’’; to_char; to_number,to_date等。
Eg:
SelectjobidfrommytabswhereisReq='0'andto_date(updatedate)>=to_Date('2001-7-18','YYYY-MM-DD');--updatedate列的索引也不会生效。

5、索引不是越多越好。特别是大量从来或者几乎不用的索引,对系统只有损害。OLTP系统每表超过5个索引即会降低性能, 而且在一个sql中,Oracle从不能使用超过5个索引。
索 引对select有正面效果,但对insert,delete尤其是update有负面效果,会影响速度,索引越多,影响越大。所以oracle工具 sqlldr倒入数据时,好的做法是先建好表结构,再倒入数据,最后才建索引,以提高数据倒入的速度,oracle工具import默认就是先倒入数据, 然后才建索引。所以建索引时要充分考虑该表的主要应用。
Tips:经常做insert,delete尤其是update的表最好定期 exp/imp表数据,整理数据,降低碎片(缺点:要停应用,以保持数据一致性,不实用);有索引的最好定期rebuild索引(rebuild期间只允 许表的select操作,可在数据库较空闲时间提交),以降低索引碎片,提高效率;

6、何时适合使用全表扫描?
 --小表,仅有几个datablock的表(5M以下);
--对数据行的选择率高于20%时可考虑用全表扫描(如有1000行记录,一次选出200行以上)
7.选择联合查询的联合次序。联合查询分为3种:mergejoin,nestedloop,hashjoin,这里讲的是nested loop的联合情况(后面实际案例1的优化就属于此类);
考虑下面的例子:
SELECTstuff FROMtabaa,tabbb,tabcc
WHEREa.acolbetween:alowand:ahigh
ANDb.bcolbetween:blowand:bhigh
ANDc.ccolbetween:clowand:chigh
ANDa.key1=b.key1
AMDa.key2=c.key2;
这 个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表 B和表C相应列的范围小。内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。

8、用UNIONALL代替UNION:
UNION是最常用的集操作,使多个记录集联结成为单个集,对返回的数据行有唯一性要求,所以oracle就需要进行SORTUNIQUE操作(与使用distinct时操作类似),如果结果集又比较大,则操作会比较慢;
UNIONALL操作不排除重复记录行,所以会快很多,如果数据本身重复行存在可能性较小时,用unionall会比用union效率高很多!

9.避免在SQL里使用PL/SQL功能调用:
PL/SQL块有利于提高重复使用,但是如果混合在SQL语句中,反而会降低效率。Eg:
US$()为一货币转换的PL/SQL
Sql: selectname,US$(amount,currency)fromsalarywhereUS$(amount,currency)>1000;
该sql效率低下,因为混合PL/SQL和sql时,oracle使用的机制不同,执行时,oracle将调用分成两个组件:用带有赋值变量的SQL语句代替功能调用,和对功能调用的PL/SQL块:
即:
selectname,:a1fromsalarywhere:a2>1000;

begin
:a1:=US$(:amount,:currency);
end;
对salary表里的每一行执行PL/SQL两次,效率大大降低。

10子查询中慎重使用IN或者NOTIN语句,使用where(NOT)exists的效果要好的多。IN、OR子句常会使索引失效,可以考虑把子句拆开,拆开的子句中尽量包含索引。
11慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。

12 ORACLE 提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存 较多的存储过程“钉”到内存中有利于提高最终用户的响应时间。一定要确认非常有必要时才采用这个方法,否则对系统只有坏的影响,会降低内存利用率。
(executeDBMS_SHARED_POOL.KEEP('APPOWNER.ADD_CLIENT','P');
(P代表PROCEDURES,C代表CURSORS))

13. 从物理存储方面降低竞争,提高索引效率:将索引和数据分开不同的表空间存放,以减少I/O竞争(尽量将索引、数据表空间从物理底蹭分开是数据库建设前期物 理设计工作的重要部分)。举例:九七数据库里的TB表(长驻cache;仅几十行数据,并发度高,更新频繁,分多个block存放,降低blockI/O 竞争)

14.加hint强制使用索引
有时候oracle自动判断的CBO信息不能令人满意时,就需要我们手工加hint来强制sql语句得到我们想要的执行计划。
Hint的基本使用方法:
----紧跟DML(select,insert,delete,update)之后:/*+hint_content*/,/*和+之间不能有空格;或者用--+,此行后面均为hint内容;
----一句sql只能有一个hint,但里面可以有多层,eg:/*+hint1,hint2…*/;
----sql语句中若使用了别名(aliase),则hint里面也必须使用别名。
--不要对view查询加hint,无效。
Tip:尽量少用hint,因为随着数据变化,可能加hint的执行计划逐渐变的不再是最优;加hint的维护成本较高;

15.使用session/transaction级别的临时表会大大提高中间处理的速度:
---临时表只对本session或者transaction可见,关闭session或者退出transaction时,临时表自动被清理drop;
---其他session/transaction可以建同名的temporarytable,用户只对自己的temptable操作;
---临时表使用temp表空间,此类表的DML操作不产生redolog,只产生undolog
---可以在其上建index,index也一样是temporary的,生命阶段同temptable。
createglobaltemporarytabletab_name(….);

结语:
Oracle 是否真正使用索引,使用索引是否真正有效,还是必须进行实地的测验。合理的做法是,对所写的复杂的sql,在将它写入应用程序之前,先在产品数据库上做一 次explain,获得对该sql的解析,明确看到Oracle是如何执行该sql的,并进行适当优化调整;
另外,即使是相同的sql语句,也会 因为表的大小等原因造成执行计划的不同,所以一定要具体情况具体分析!如果经常做explain,就会发现,喜爱写复杂的sql并不是个好习惯,因为过分 复杂的sql其解析计划往往不尽如人意。事实上,将复杂的sql拆开,有时候会极大地提高效率,因为能获得很好的优化。

                                                     
 2004.5.26定稿
实际案例:
1、select'x'fromdhwheredhsoin(selectogsofromogwheregid=21097023andgzt='VALID')anddhcz=18anddhzt<>'OVER';
执行情况:norowsselected  Elapsed:00:07:05.98
ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=CHOOSE
  1   0  VIEW
  2   1    SORT(UNIQUE)
  3   2      NESTEDLOOPS
  4   3        TABLEACCESS(BYINDEXROWID)OF'DH'
  5   4          INDEX(RANGESCAN)OF'IND_DHCZ_DHZT'(NON-UNIQUE)
  6   3        TABLEACCESS(BYINDEXROWID)OF'OG'
  7   6          INDEX(UNIQUESCAN)OF'PK_OGID_OGSO'(UNIQUE)
Statistics
----------------------------------------------------------
         0 recursivecalls
         0 dbblockgets
    421027 consistentgets
     15181 physicalreads
      1000 redosize
       181 bytessentviaSQL*Nettoclient
       278 bytesreceivedviaSQL*Netfromclient
         1 SQL*Netroundtripsto/fromclient
         1 sorts(memory)
         0 sorts(disk)
0rowsprocessed
原语句用7分6秒完成,使用sqlexpert优化后选取的一个新语句如下,出结果仅用8秒!
select/*+ALL_ROWS*/'x'fromdh
 whereEXISTS(SELECT'X'fromogWHEREgid=21097023andgzt='VALID'ANDgso=dhso)   anddhcz=18anddhzt<>'OVER';
执行情况: norowsselected  Elapsed:00:00:08.23
ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=HINT:ALL_ROWS(Cost=119Card=55
         Bytes=3410)
  1   0  TABLEACCESS(BYINDEXROWID)OF'DH'(Cost=2Card=1Bytes
         =31)
  2   1    NESTEDLOOPS(Cost=119Card=55Bytes=3410)
  3   2      SORT(UNIQUE)
  4   3        TABLEACCESS(BYINDEXROWID)OF'OG'(Cost=6Card=5
         5Bytes=1705)
  5   4          INDEX(RANGESCAN)OF'PK_OGID_OGSO'(UNIQUE)(Cos
         t=2Card=2191)

  6   2      INDEX(RANGESCAN)OF'IND_DHSO'(NON-UNIQUE)(Cost=1
         Card=2018)
Statistics
----------------------------------------------------------
        16 recursivecalls
         0 dbblockgets
        10 consistentgets
         1 physicalreads
         0 redosize
       181 bytessentviaSQL*Nettoclient
       278 bytesreceivedviaSQL*Netfromclient
         1 SQL*Netroundtripsto/fromclient
         1 sorts(memory)
         0 sorts(disk)
         0 rowsprocessed


2、select GGZT,GGXX,GGSJ,GGRQ,GGLR,GGGH,GGDH,GGBZ,GGID 
fromGG whereGGRQ>='20040325'
andGGRQ<='20040325'andGGID>8673andGGZT='VALID'andGGIDin 
(select GFGGfromGF,GBwhereGFGG=GBGG
and((GFGW=1andGFQX>='003'andGBLX='001'andGBDW=104) 
or(GFGW=118andGFQX>='000'andGBLX='002'andGBDW=102)))
orderbyGGIDDESC;
--联合查询三个小表(GG1M, GB2M, GF2M),用了索引反而慢,又费cpu,优化后改成全表扫描:

执行情况:
norowsselected
Elapsed:00:00:18.57
ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=CHOOSE
  1   0  SORT(ORDERBY)
  2   1    VIEW
  3   2      SORT(UNIQUE)
  4   3        CONCATENATION
  5   4          NESTEDLOOPS
  6   5            NESTEDLOOPS
  7   6              TABLEACCESS(BYINDEXROWID)OF'GB'
  8   7                INDEX(RANGESCAN)OF'IND_GBLX_GBDW'(NON-U
         NIQUE)
  9   6              TABLEACCESS(BYINDEXROWID)OF'GF'
 10   9                INDEX(RANGESCAN)OF'IND_GFGW'(NON-UNIQUE
         )
11   5            TABLEACCESS(BYINDEXROWID)OF'GG'
 12  11              INDEX(UNIQUESCAN)OF'PK_GGID'(UNIQUE)
 13   4          NESTEDLOOPS
 14  13            NESTEDLOOPS
 15  14              TABLEACCESS(BYINDEXROWID)OF'GB'
 16  15                INDEX(RANGESCAN)OF'IND_GBLX_GBDW'(NON-U
         NIQUE)
 17  14              TABLEACCESS(BYINDEXROWID)OF'GF'
 18  17                INDEX(RANGESCAN)OF'IND_GFGW'(NON-UNIQUE
         )
 19  13            TABLEACCESS(BYINDEXROWID)OF'GG'
 20  19              INDEX(UNIQUESCAN)OF'PK_GGID'(UNIQUE)
Statistics
----------------------------------------------------------
       243 recursivecalls
         0 dbblockgets
    346554 consistentgets
        20 physicalreads
         0 redosize
       534 bytessentviaSQL*Nettoclient
       278 bytesreceivedviaSQL*Netfromclient
         1 SQL*Netroundtripsto/fromclient
         8 sorts(memory)
         0 sorts(disk)
         0 rowsprocessed


select/*+full(gg)*/GGZT,GGXX,GGSJ,GGRQ,GGLR,GGGH,GGDH,GGBZ,GGID 
fromGG whereGGRQ>='20040325'
andGGRQ<='20040325'andGGID>8673andGGZT='VALID'andGGIDin 
(select/*+full(gf)*/GFGGfromGF,GBwhereGFGG=GBGG
and((GFGW=1andGFQX>='003'andGBLX='001'andGBDW=104) 
or(GFGW=118andGFQX>='000'andGBLX='002'andGBDW=102)))
orderbyGGIDDESC;
执行情况:
norowsselected

Elapsed:00:00:07.96

ExecutionPlan
----------------------------------------------------------
  0     SELECTSTATEMENTptimizer=CHOOSE(Cost=25Card=1Bytes=715)
  1   0  SORT(ORDERBY)(Cost=25Card=1Bytes=715)
  2   1    HASHJOIN(SEMI)(Cost=22Card=1Bytes=715)
  3   2      TABLEACCESS(FULL)OF'GG'(Cost=3Card=1Bytes=702)
  4   2      VIEWOF'VW_NSO_1'(Cost=18Card=1Bytes=13)
  5   4        HASHJOIN(Cost=18Card=1Bytes=62)
  6   5          TABLEACCESS(BYINDEXROWID)OF'GB'(Cost=4Card
         =1041Bytes=32271)
  7   6            BITMAPCONVERSION(TOROWIDS)
  8   7              BITMAPOR
  9   8                BITMAPCONVERSION(FROMROWIDS)
 10   9                  INDEX(RANGESCAN)OF'IND_GBLX_GBDW'(NON
         -UNIQUE)(Cost=1)
 11   8                BITMAPCONVERSION(FROMROWIDS)
 12  11                  INDEX(RANGESCAN)OF'IND_GBLX_GBDW'(NON
         -UNIQUE)(Cost=1)
 13   5          TABLEACCESS(FULL)OF'GF'(Cost=13Card=1213Byt
         es=37603)
Statistics
----------------------------------------------------------
       390 recursivecalls
         0 dbblockgets
        82 consistentgets
         4 physicalreads
         0 redosize
       534 bytessentviaSQL*Nettoclient
       278 bytesreceivedviaSQL*Netfromclient
         1 SQL*Netroundtripsto/fromclient
         1 sorts(memory)
         0 sorts(disk)
         0 rowsprocessed

相关阅读:

基于Oracle数据库上的SQL语句优化分析^oracle排序参数

基于Oracle数据库上的SQL语句优化分析发布时间:2010.04.23淘宝搜索排序规则10:19来源:赛迪网作者:J最好的系统优化工具avathingking【赛迪网-IT技术报道】操作符优化IN操作符用IN写出来的SQL的优点是比较...

ORACLE优化SQL语句提高效率(二)—Oracle认证—易考吧@oracl...

编辑推荐:erp培训索引是表的一个概念部分,用来提高检索数据的效率,Oracle使用了一个复杂oracle 优化工具的自平衡B-tree结构。通常,通过索引查询数据比全表扫描要快。当Oracoracle数据库视频教程le找出执行查询和Up...

oracle数据库优化_MySpace聚友免费博客

数据库优化的讨论可以说是一个永恒的主题。资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statsoracle sohupack,贴出数据库配置等等。还有的人认为要抓出执行最慢的语句来进行oracle培训优化。但实际情况...

30个Oracle语句优化规则详解—数据库编程^oracle优化模式

24.用EXPLAINPLAN分析SQL语句EXPLAINPLAN是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句。通过分析,我们就可以知道Oracle是怎么样连接表,使最好的系统优化工具用什

30个Oracle语句优化规则详解—数据库编程^oracle优化模式

24.用EXPLAINPLAN分析SQL语句EXPLAINPLAN是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句。通过分析,我们就可以知道Oracle是怎么样连接表,使最好的系统优化工具用什

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值