Oracle调优总结

来源:互联网 发布:c语言面向对象编程 编辑:程序博客网 时间:2024/05/22 03:21

Problem Description:
1.
个表的构及主索引情况

2.
个表的count(*)记录是多少
3.
建索引的列,索引的型是什count(distinct indexcol)是多少?
4.最后一次行分析是在什么时间,分析后,是否又表做大的操作
5.
索引最后一次rebuild,是在什
么时间,此后表的操作型又是什状况?索引中浪的空是多少?
6.
些表的存情况,表的存参数,表空型,存参数等
7.
SQL,系等候的源是什Trace SQL句的
8.
另一台行相似SQL速度很快的机器上的相表的如上信息是什

一:SQL tuning
1:
接方式
  hash join/merge join/nest loop(cluster join)/index join

2:不借助第三方工具,怎样查sql
set autotrace on
set autotrace traceonly

explain plan set statement_id = &item_id for &sql;
select * from table(dbms_xplan.display);
http://download-west.oracle.com/ ... /b10752/ex_plan.htm

3:如何使用CBO,CBORULE的区
 
optimizer_mode=choose,如果表有统计信息(分区表外),化器将选择CBO,则选RBO

  RBO遵循简单的分方法学,使用15种级别要点,当接收到查询化器将估使用到的要点数目,
然后
选择最佳级别(最少的数量)的行路径来运行查询
CBO
尝试找到最低成本的访问数据的方法,了最大的吐量或最快的初始响应时间,算使用不同
划的成本,并选择成本最低的一个,于表的数据内容的统计被用于确定划。

4:如何定位重要(消耗源多)SQL
  select sql_text
  from v$sql
where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000);

5:如何跟踪某个sessionSQL
  exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace);

select sid,serial# from v$session where sid = (select sid from v$mystat where rownum = 1);
  exec dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,'');

6:SQL整最注的是什
 
SQLresponse time(db block gets/consistent gets/physical reads/sorts (disk))

7:说说索引的认识(索引的构、dml影响、提高查询性能)
  b-tree index/bitmap index/function index/patitional index(local/global)
 
索引通常能提高select/update/delete的性能,会降低insert的速度,
 
8:
使用索引
查询一定能提高查询的性能

 
索引就是了提高查询性能而存在的,
如果在
查询中索引没有提高性能
,
只能
是用了索引,或者合不同

9:量是什量有什么优缺点?
 
量是相文本量来,文本量是指在SQL直接查询条件,
这样SQL在不同条件下需要反解析,量是指使用量来代替直接写条件,
查询bind value在运行时传递,然后行。
 
点是减少硬解析,降低CPU的争用,shared_pool
缺点是不能使用histogram,sql
化比

10:如何(固定)
  query_rewrite_enabled = true
  star_transformation_enabled = true
  optimizer_features_enable = 9.2.0

建并使用stored outline
  http://download-west.oracle.com/ ... /outlines.htm#26854
 
:
http://www.cnoug.org/viewthread.php?tid=27598
 
11:
和排序相
的内存在8i9i样调整,临时表空的作用是什

   8i
sort_area_size/sort_area_retained_size决定了排序所需要的内存
 
如果排序操作不能在sort_area_size中完成,就会用到temp表空

  9i中如果workarea_size_policy=auto,
 
排序在pga
,通常pga_aggregate_target1/20可以用来
disk sort;
 
如果workarea_size_policy=manual
,排序需要的内存由sort_area_size决定

   order by/group by/distinct/union/create index/index rebuild/minus等操作,
 
如果在pgasort_area_size中不能完成,排序将在
临时表空间进行(disk sort
,
 
临时表空主要作用就是完成系中的disk sort.

12:存在表T(a,b,c,d),要根据字段c排序后取第21—30记录显示,请给sql
   create table t(a number(,b number(,c number(,d number();
  /
  begin      
    for i in 1 .. 300 loop
      insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4);
    end loop;
  end;
  /
   select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30;
   /
  select * from (select * from test order by c desc) x where rownum < 30
  minus
   select * from (select * from test order by c desc) y where rownum < 20 order by 3 desc
  
相比之 minus性能

二:数据基本概念

1:pctused and pctfree 表示什有什作用
  pctused
pctfree控制数据是否出freelist,
pctfree
控制数据
中保留用于update的空,当数据中的free space小于pctfree置的空间时
,
数据freelist中去掉,由于dml操作free space大于pct_used置的空间时,数据库块

被添加在freelist表中。
 --PCTFREE
参数
  PCTFREE
参数告ORACLE么时应该将数据象的空列表中移出。ORACLE的默参数是PCTFREE=10

也就是,一旦一个INSERT操作使得数据90%被使用,个数据就从空列表(free list)中移出。
 --PCTUSED
参数

  PCTUSED
参数告ORACLE么时候将以前的数据加到空列表中。当记录从数据表中,数据的数

就有空接受新的记录,但只有当填充的空降到PCTUSED以下数据才被接到空列表中,才可以往
其中插入数据。PCTUSED的默认值PCTUSED=40
 --
参数规则

  (1PCTUSED
高意味着相对较满的数据会被放置到空列表中,从而有效的重使用数据的空,但会

I/O
消耗。PCTUSED低意味着在一个数据快空的候才被放置到空列表中,数据一次能接受很多的记录,因此可以
减少I/O消耗,提高性能。
  (2PCTFREE
值较大意味着数据没有被利用多少就从空列表中断开连接,不利于数据的充分使用。
PCTFREE
小的果是,在更新可能会出数据记录迁移(Migration)的情况。(注:数据记录迁移(Migration)是指记录在是

UPDATE
操作展了一个VARCHAR2型的列或BLOB列后,PCTFREE参数所指定的空够扩展,从而记录ORACLE制迁移到
新的数据这种情况将较严重的影响ORACLE的性能,出更新)
  (3)在批量的插入、
除或者更新操作之前,先表上的索引,在操作完之后在重新建立,这样有助于提高

批量操作的整体速度,并且保B索引在操作之后有良好的性能。

---------------------------------------------------------------------------------------------------------------------------------------------------
--MartriWang@gmail.com 17/05/2007--
--
表的pctfreepctused两个参数
行估算的方法

于不同的用系,表的pctfree pctused两个参数有不同的设计,以下是根据特定的用系统进行估算的例子,从中可以掌握基本的估算方法。
 
表的存参数整,一般情况,pctfree 5 pctused 85即可(缺省pctfree 10 pctused 40
1.
Pctfree参数
除了可以按字段及字段度估算平均行外,下面的方面可以根据已有数据分析出平均行每块行数
例:
analyze table
病人信息 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '
病人信息'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
 857291 14161 61 117 

于一般8192实际可用空间为8100左右.
以前表的pctfree15,改5后,pctfree减少10,就可以再存入7.

相同的14就可以多存放10万行数据,
10万行数据,如果按每块60行算,就可以少占用1700(13M的空)
如果全表
表的,少1700数据,少106IO操作(按缺省db_file_multiblock_read_count=16
)
少占13M的内存

另外,需要考的两个因素
1
。更新操作,数据增量大不大,例如:主要是把状字段由13是把摘要由空改一段文字
2
。并的多少,因一个事信息在中要占用24Byte,如果有10个并,至少外考240Byte的空

2.Pctused参数
主要考虑删除后插入数据的情况多不多,以及平均行大小
例如:
病人记录,医保如果存在校操作的,是先算数据,正式些数据再重新生成
所以,病人记录,Pctused不能置太高,否重用那些低于Pctused,只能插入少量数据行,增加了IO操作
analyze table
病人记录 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '
病人
记录'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
 181758 2147 85 83 

如果pctfree 5 pctused 85,那除一些行使的已用空低于85%会被重用,但是因5%的空
所以,于已用空间刚刚低于85%,重用空就只有10%,8K,可用810Byte,平均行83,可以再放入9行,所以个参数也是可以的。

但是,如果是病人记录,平均行229这样设置,只能放下3行,个参数就不太合适了
 
    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
 925133 38278 24 229 

根据分析,病人记录的数据更新量不大,但是并操作比大,最好把Pctfree置高一点
所以,可以pctfree 10 pctused 75(重用的至少可以放5行,1-2张单据),甚至pctused 70也是可以的。

如果一个的数据行数太多,可能造成热块争用,但是相于减少存,减少IO,减少内存占用来的好热块不是特突出的情况下可以不考

--MartriWang@gmail.com 17/05/2007--

PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
  

  Oracle的其中一个它可以管理个表空中的自由空Oracle负责处理表和索引的空管理,这样就可以无需懂得Oracle的表和索引的
内部运作。不于有经验Oracle调优专家来,他需要懂得Oracle是如何管理表的extent和空的数据有高的insert或者update的系
是非常重要的。
  
  要精通象的整,你需要懂得freelistsfreelist的行,它pctfreepctused参数的些知识对于企业资划(ERP)的用是
重要的,因用中,不正确的表置通常是DML行慢的原因。 
  于初学者来,最常错误认为Oracle参数于所有的象都是最佳的。除非磁的消耗不是一个问题,否置表的pctfreepctused
参数
,就必平均的行和数据大小,这样空的才会被有效地放到freelists中。当置不正确,那些得到的freelists也是"dead"

没有足的空来存一行,这样将会致明理延
  Freelists于有效地重新使用Oracle表空中的空是很重要的,它和pctfreepctused两个存参数的置直接相。如果将pctused一个高的
这时数据就会尽快地重新使用。不,高性能和有效地重新使用表的立的。在Oracle的表格和索引,需要真考究竟需要高性能是有效的空
重用,并且据此来置表的参数。以下我来看一下freelists是如何影响Oracle的性能的。
  
  当有一个求需要插入一行到表格中Oracle就会到freelist找一个有足的空来容一行的。你也知道,freelist串是放在表格或者索引的第
一个中,也被称segment header)。pctfreepctused 参数的唯一目的就是了控制如何在freelists出。freelist link unlink
简单Oracle功能,不过设freelist link (pctused) unlink (pctfree) Oracle的性能确有影响。

  
  由DBA的基本知知道,pctfree参数是控制freelist un-links的(即将freelists中移除)。pctfree=10 意味着都保留10%的空用作行展。
pctused
参数是控制freelist re-links的。pctused=40意味着只有在的使用低于40%才会回到表格的freelists中。
  
  多新手于一个重新回到freelists后的理都有些解。其,一旦由于一个除的操作而令被重新加入到freelist中,它将会一直保留在freelist
即使空的使用超60%,只有在到达pctfree才会将数据freelist中移走。
  
  表格和索引存参数置的要求总结
  
  以下的一些规则是用来freelists, freelist groups, pctfreepctused参数的。你也知道,pctusedpctfree是可以很容易地通alter table
命令修改的,一个好的DBA
应该知道如何些参数的最佳

  
  有效地使用空和高性能之是有矛盾的,而表格的存参数就是控制个方面的矛盾:
  
  . 于需要有效地重新使用空,可以置一个高的pctused,不副作用是需要外的I/O。一个高的pctused意味着相对满都会放到freelist中。因
此,在再次之前只可以接受几行记录,从而致更多的I/O
  
  . 追求高性能的,可以将pctused一个低的意味着Oracle不会将数据放到freelists中直到它几乎是空的。那么块将可以在之前接收更多的行,
因此可以减少插入操作的I/O。要Oracle展新的性能要比重新使用有的高。Oracle展一个表比管理freelists消耗更少的源。
  
  来回一下象存参数的一些常见规则
  
  .常将pctused可以接收一条新行。于不能接受一行的free blocks于我是没有用的。如果这样做,将会令Oracle的性能慢,因Oracle
展表来得到一个空的之前,企图读5"dead" free block
  
  .表格中chained rows的出意味着pctfree太低或者是db_block_size太少。在很多情况下,RAWLONG RAW列都很巨大,以至超Oracle的最大的大小,
这时chained rows是不可以避免的。
  
  .如果一个表有同插入的SQL句,那它需要有同时删除的句。运行一个一个清除的工作将会把全部的空闲块放到一个freelist中,而没有其它包含有任何
闲块freelists
  
  .freelist参数应该设表格同更新的最大。例如,如果在任何候,某个表最多有20个用户执行插入的操作,那么该表的参数应该设freelists=20
  
  应记住的是freelist groups参数的只是Oracle Parallel ServerReal Application Clusters才是有用的。这类Oraclefreelist groups应该设
为访问该表格的Oracle Parallel Server例的数目。

---------------------------------------------------------------------------------------------------------------------------------------------------

2:简单描述table / segment / extent / block
  table
,认创建了一个data segment,
data segment含有min extents指定的extents
,
extent据据表空的存参数分配一定数量的blocks

3:描述tablespacedatafile
一个tablespace可以有一个或多个datafile,datafile只能在一个tablespace,
table
中的数据,
hash算法分布在tablespace中的各个datafile
,
tablespace
逻辑上的概念,datafile在物理上存了数据种种对象。

4:本地管理表空和字典管理表空的特点,ASSM有什特点
 
本地管理表空Locally Managed TablespaceLMT
  8i
以后出的一新的表空的管理模式,通来管理表空的空使用。
 
字典管理表空Dictionary-Managed TablespaceDMT
  8i
以前包括以后都可以使用的一表空管理模式,通数据字典管理表空的空使用。
 
段空管理(ASSM),
 
它首次出Oracle920里有了ASSM接列表freelist被位所取代,它是一个二制的数
 
迅速有效地管理存储扩展和剩余区free block),因此能改善分段存
  ASSM
表空建的段有另外一个称呼叫Bitmap Managed SegmentsBMB 段)。

5:段的作用是什
:当事修改表中数据的候,数据修改前的(即前影像)会存放在回段中,
         
当用ROLLBACKORACLE将会利用回段中的数据前影像来将修改的数据恢到原来的
 
 
:当事正在理的候,例程失,回段的信息保存在undo表空中,
           ORACLE
将在下次打数据库时利用回来恢未提交的数据。

 一致性:当一个会正在修改数据,其他的会将看不到未提交的修改。
          
当一个句正在该语句将看不到从该语行后的未提交的修改(级读一致性)
     
ORACLESELECTORACLE依照当前的系号(SYSTEM CHANGE NUMBER-SCN
     
来保任何前于当前SCN的未提交的改不被该语理。可以想象:当一个长时间查询正在
     
若其他会该查询查询的某个数据ORACLE将利用回段的数据前影像来构造一个一致性视图
  http://www.itpub.net/showthread. ... E%B5%C4%D7%F7%D3%C3

6:日志的作用是什
 
记录数据,最大限度地保数据的一致性与安全性

  重做日志文件:含数据所做的更改记录这样万一出故障可以启用数据恢,一个数据至少需要两个重做日志文件
 
档日志文件:是重做日志文件的脱机副本,些副本可能于从介行恢很必要。

http://www.cnoug.org/viewthread. ... hlight=%C8%D5%D6%BE

7:SGA主要有那些部分,主要作用是什
  SGA
db_cache/shared_pool/large_pool/java_pool
db_cache:
 
数据
库缓存(Block BufferOracle数据的运和性能起着非常关键的作用,

  
它占据Oracle数据SGA(系共享内存区)的主要部分。Oracle数据使用LRU
  
算法,将最近
访问的数据存放到存中,从而数据的访问
.
shared_pool:
 
共享池的大小
Oracle 性能来都是很重要的。

 
共享池中保存数据字典高速冲和完全解析或编译的的PL/SQL SQL 句及控制
large_pool:
 
使用MTS配置,因要在SGA中分配UGA来保持用的会,就是用Large_pool来保持个会内存
  
使用RMAN份的候,要使用Large_pool个内存构来做磁I/O存器
java_pool:
 
java procedure预备的内存区域,如果没有使用java proc,java_pool不是必
  
8racle
统进程主要有哪些,作用是什
 
数据写(dbwr)负责将更改的数据从数据库缓冲区高速存写入数据文件
 
日志写
(lgwr):将重做日志冲区中的更改写入在线重做日志文件

 
统监(smon)  检查数据的一致性如有必要会在数据开时数据的恢

 
(pmon)  负责在一个Oracle 程失败时清理

 
检查(chpt)负责冲区高速存中的更改永久地记录在数据,更新控制文件和数据文件中的数据信息。

 
(arcn)  :在次日志切换时把已的日志组进份或

 
业调度器(cjq)  :负责度与行系中已定好的job,完成一些的工作
.
复进(reco)  :分布式事的一致性,在分布式事,commit,rollback;

三:份恢复类

1:份如何分
逻辑备份:exp/imp
物理
份:

    RMAN

     full backup/incremental backup(
/差异)
    
热备
:alter tablespace begin/end backup;
    
:脱机
(database shutdown)
    
2:
档是什

档日志:Oracle要将填的在线日志文件组归,要建立档日志(archived redo log)。
数据库备份和恢有下列用
    <1>
数据
以及在线档日志文件,在操作系和磁故障中可保全部提交的事物可被恢

    <2>
在数据
和正常系使用下,如果档日志是永久保存,在线可以行和使用。

 
数据
可运行在两不同方式下:

   NOARCHIVELOG
方式或ARCHIVELOG 方式
数据NOARCHIVELOG方式下使用,不能行在线日志的,
如果数据
ARCHIVELOG方式下运行,可施在线日志的档。

3:如果一个表在2004-08-04 10:30:00 drop,在有完善的档和份的情况下,如何恢?
 
手工拷
回所有份的数据文件

sql>startup mount;
sql>alter database recover automatic until time '2004-08-04:10:30:00';
sql>alter database open resetlogs;

4:rman是什,有何特点?
RMAN(Recovery Manager)
DBA的一个重要工具,用于
份、原和恢oracle数据
,
RMAN
可以用来
份和恢数据文件、档日志、控制文件、系参数文件,也可以用来行完全或不完全的数据

RMAN
有三不同的用接口:
  COMMAND LINE
方式、GUI 方式(集成在OEM 中的份管理器)、API 方式(用于集成到第三方的件中)。
具有如下特点:
1
)功能似物理份,但比物理N倍;
2
)可以压缩
3
)可以在水平上实现增量;
4
)可以把份的出打包成份集,也可以按固定大小分割份集;
5
份与恢程可以自管理;
6
)可以使用脚本(存在Recovery catalog 中)
7
)可以做坏块监测

5:standby的特点
用数据standby database):ORACLE推出的一高可用性(HIGH AVAILABLE)数据方案,
在主点与日志同来保数据的同点作点的
可以实现快速切与灾性恢,920始,还开始支持物理与逻辑备用服器。
  9i
中的三数据保模式分是:
  1)
MAXIMIZE PROTECTION :最大数据保与无数据分歧,LGWR将同时传送到点,
   
在主点事之前,点也必完全收到日志数据。如果网不好,引起LGWR不能送数据,将引起重的性能问题致主DOWN机。
  2)
MAXIMIZE AVAILABILITY :无数据失模式,允数据分歧,允步传送。
   
正常情况下运行在最大保模式,在主点与点的网接不正常,自到最大性能模式,
  
点的操作是可以继续的。在网不好的情况下有大的性能影响。
  3)
MAXIMIZE PERFORMANCE这种模式当可以是从8i来的用服器模式,异步传送,
   
无数据同步检查,可能失数据,但是能得主点的最大性能。9i在配置DATA GUARD候默就是MAXIMIZE PERFORMANCE

6:于一个要求恢复时间短的系(数据50G,5G),你如何设计备份策略
  rman/
月一号 level 0 周末/周三 level 1 其它level 2 

四:系管理

1:于一个存在系性能的系出你的理思路
1
statspack收集系信息
 
了解系大致情况/确定是否存在参数置不合适的地方/top 5 event/top sql
2
v$system_event/v$session_event/v$session_wait
  
v$system_event
,确定需要什么资(db file sequential read)

 
深入研究v$session_event,确定等待事件及的会
 
v$session_wait确定详细源争用情况(p1-p3:file_id/block_id/blocks)
3
v$sql/v$sqltext/v$sqlarea表确定disk_reads(buffer_gets/executions)值较大的SQL

2:种诊IOCPU、性能状况的方法
    top/vmstat
  statspack
  sql_trace/tkprof
   
v$system_event/v$session_event/v$session_wait
 
v$sqlarea(disk_readsbuffer_gets/executions大的SQL)

3:statspack有何认识
StapSpack
Oracle公司提供的一个收集数据运行性能指件包,该软件包从8i起,在9i10g都有著的增
该软件包的助表(存参数与收集的性能指的表)由最初的25个增43
收集级别参数由原来的3个(0510)增加到5个(056710
分析收集的性能指,数据管理可以详细地了解数据目前的运行情况,数据库实例、等待事件、SQL
利用statspack收集的snapshot,可以统计制作数据的各性能指统计趋势图表。

4:如果系统现在需要在一个很大的表上建一个索引,你会考那些因素,如何做以尽量减小对应用的影响
在系闲时
nologging
选项(如果有dataguard不可以使用nologging
大的sort_ared_sizepga_aggregate_target

5:raid1+0 raid5有何认识
RAID 10(
或称RAID 10)RAID 01不同,它是用硬盘驱动器先RAID 1列,然后在RAID 1列之RAID 0列。
RAID 10
模式同RAID 0+1模式一具有良好的数据传输性能,但却比RAID 0+1具有更高的可靠性。RAID 10列的实际容量M×n/2
利用率50%。RAID 10也需要至少4个硬盘驱动器构成,因而价格昂
  RAID 10
的可靠性同RAID 1
,但由于RAID 10盘驱动器之有数据分割,因而数据传输性能良。

RAID 5RAID 3很相似,不同之在于RAID 5的奇偶校信息也同数据一被分割保存到所有的硬盘驱动器,
而不是写入一个指定的硬盘驱动器,从而消除了个奇偶校盘驱动器的瓶颈问题RAID 5盘阵列的性能比RAID 3有所提高,
但仍然需要至少3盘驱动器。其实际容量M×(n-1),磁利用率(n-1)/n

五:合随意

1:你最擅的是oracle哪部分?
pl/sql
sql

2:oracle?喜论坛吗?或者偏好oracle的哪一部分?
,sql

3:随意说说oracle最有意思的部分或者最困的部分
latch free

4:何要选择DBA?
趣所在

--MartriWang@gmail.com 17/05/2007--
消耗在准
利用Oracle划机制提高查询性能新的SQL句的时间Oracle SQL时间的最重要的成部分。

但是通理解Oracle内部划的机制,你能控制Oracle序的时间数量,并且能在大体上提高查询性能。
备执SQL

SQL
Oracle库缓存后,在该语句准备执行之前,将行下列步骤

1)
检查检查SQL句拼写是否正确和序。

2) 语义分析:核所有的与数据字典不一致的表和列的名字。

3) 廓存储检查检查数据字典,以确定SQL句的廓是否已存在。

4) 生成划:使用基于成本的规则和数据字典中的统计表来决定最佳划。

5) 建立二制代:基于划,Oracle生成二行代

一旦为执行准好了SQL句,以后的行将很快生,因Oracle可同一个SQL句,并且重用那些句的行。然而,于生成
特殊的SQL句,或嵌入了文字量的SQL句的系SQL划的生成时间就很重要了,并且前一个划通常不能被重用。
那些接了很多表的查询Oracle需要花大量的时间检测连些表的适当序。

估表的

SQL句的准备过程中,花最多的步骤是生成划,特理有多个表接的查询。当Oracle估表的,它必
到表之所有可能的接。例如:六个表的之间连接有7206乘,或6 * 5 * 4 * 3 * 2 * 1 = 720可能的线路。
当一个查询中含有超10个表的,排列的问题得更为显著。15个表之接,需要估的可能查询排列将超1亿
(准确的数字是1,307,674,368,000

使用optimizer_search_limit参数来定限制

使用optimizer_search_limit参数,你能指定被化器用来估的最大的合数量。使用个参数,我将能防止化器
消耗不定数量的时间估所有可能的合。如果在查询中表的数目小于optimizer_search_limit化器将检查所有可能的
合。

例如:有五个表接的查询将有1205! = 5 * 4 * 3 * 2 * 1 = 120可能的合,因此如果optimizer_search_limit等于5
(默
认值),则优化器将估所有的120可能。optimizer_search_limit参数也控制着星号的接提示的阀值。当查询中的表的

数目比optimizer_search_limit星号的提示将被先考

另一个工具:参数optimizer_max_permutations

初始化参数optimizer_max_permutations化器所考虑组合数目的上限,且依于初始参数optimizer_search_limit
optimizer_max_permutations
的默认值80,000

参数optimizer_search_limitoptimizer_max_permutations一起来确定化器所考合数目的上限:除非(表或合数目)
参数optimizer_search_limit 或者 optimizer_max_permutations定的,否则优化器将生成所有可能的合。一旦
化器停止估表的合,它将选择成本最低的合。

使用ordered提示指定

你能够设化器所行的估数目的上限。但是即使采用有很高价的排列估,我仍然有使化器可以尽早地放弃复杂查询
的重要机会。回想一下含有15查询的例子,它将有超1亿种合。如果化器在估了80,000合后停止,那它才
仅仅评估了0.000006%的可能合,而且或许还没有为这个巨大的查询找到最佳的序。

Oracle SQL中解决此问题的最好的方法是手工指定表的序。了尽快建最小的解决方案集,里所遵循的规则是将表合起
来,通常
先使用限制最格的WHERE子句来接表。

下面的代是一个查询执划的例子,例子在emp表的关联查询行了嵌套的循环连接。注意,我已使用了ordered提示来
直接最化表的

原创粉丝点击