`
rkf71rkf
  • 浏览: 13786 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

sqlplus常用命令使用3

 
阅读更多

sqlplus常用命令使用3
2011年04月24日
  tkprof把跟踪文件转成可读的信息,存在的输出文件名默认后缀为.prf。
  tkprof输出格式大致如下:
  select *  from  test
  call     count       cpu    elapsed       disk      query    current        ro
  ws
  ------- ------  -------- ---------- ---------- ---------- ----------  --------
  --
  Parse        1      0.00       0.00          0          0          0         
  0
  Execute      1      0.00       0.00          0          0          0         
  0
  Fetch        2      0.00       0.00          0          2          3         
  2
  ------- ------  -------- ---------- ---------- ---------- ----------  --------
  --
  total         4      0.00       0.00          0          2          3        
  2
  Misses in library cache during parse: 0
  Optimizer goal: CHOOSE
  Parsing user id: 5  
  那么,所有的这些信息意味着什么呢?它如何帮助我们优化应用?虽然利用大多数诊断工
  具可以提供信息,但却不能提供解释,至少不能提供自动解释。下面我们来看一下这些统
  计信息的意义:
  count    = parse,execute或fetch调用的执行次数
  cpu      = 实际使用CPU时间,以秒为单位(如果为0.00,说明这个语句在库缓冲中)
  elapsed  = 实际操作时间,单位:秒。(应大于或等于CPU时间)
  disk     = 从数据文件读的Oracle块,也被称做物理读操作
  query    = 为保持数据一致性,Oracle在撤消缓冲区中进行的缓冲读操作,其结果保存于
  缓冲区中,也被称做一致性访问。
  current  = 当前方式下,Oracle在数据库缓冲区中进行的缓冲读,也被称为数据库块访问
  。
  rows     = 由主驱动语句所访问的行的数量。
  逻辑读操作的数量=query+current
  作为DBA,作为一名应用程序开发者、程序员或DBA,应努力实现以下目标:
  尽量减少逻辑读操作 只访问只需访问的东西,不要多访问任何其它东西,尽量使用捷径。
  尽可能将物理读操作和逻辑读操作的比例下降为0  首先,确保尽量减少逻辑读操作目标的
  实现;第二,确保你以最有效的方式访问你所需的要访问的东西;第三,增加SGA中的数据
  库缓冲区,在必要情况下加大内存。对于大多灵敏语句而言,这个比较的平均值应小于0.
  10,也就是说在数据库缓冲中要有>90%的命中率。
  尽可能将逻辑读操作和行数的比例降为0  在每次逻辑读操作中,应读取尽可能多的行。这
  个比例越小,读操作的效率越高。如果这个比率值太大,就要调整DB_BLOCK_SIZE。
  由于我们所做的试验记录数较少,统计出的信息作为教学示例,并不一定具有实际意
  义。
  三.优化内存
  在Oracle中,优化内存经常味意着优化SGA。它包括监视和优化共享区(数据字典和库缓存
  )和数据库缓冲区。内存优化和应用优化、I/O优化紧密相关,因为优化的主要目标之一
  ―― 减少和消除竞争――必须涉及优化过程的各个方面。现在让我们把精力转向实际收集
  和诊断内存故障。
  UTLBSTAT和UTLESTAT
  这一实用工具对是Oracle最常用的诊断工具。DBA在运行他(或她)的应用或仿真之前运行
  utlbstat。Utlbstat.sql脚本建立收集和存储性能数据所必须的开始表格。然后,DBA运行
  建立结束表格和差异表格的utlestat.sql,计算utlbstat运行和这个utlestat运行之间(
  本质上讲是应用持续时间内)的性能差异,格式化输出数据(包括注释和一些解释),并将它们写至缺省文件r
  eport.txt。该文件由DBA直接或简接解释(取一些给定的输出值,并用作一些简单公式的
  输入)。
  这两个程序脚本保存在$ORACLE_HOME/rdbms/admin子目录下。在实际应用前,应在init.o
  ra中设TIMED_STATISTICS=TRUE,或在作业级设
  ALTER SESSION SET TIMED STATISTICS=TRUE
  完成上述步骤后,执行以下步骤:
  启动svrmgrl 
  SVRMGR>connect internal;
  SVRMGR>@  $ORACLE_HOME\rdbms\utlbstat.sql
  完成上述步骤后,就会在SYS模式中创建初始的表和视图,这些对象的名字中会包括字符簇
  BEGIN,最初的统计数据将保存在这里。下一步就可以执行相应的应用了。作为DBA,你的
  目标是在它的运行的峰值时,获得有关系统的统计数据。在峰值过后或经过一段合理的时
  间,执行utlestat.sql,这个时间不必太长,但必须足够长。
  文件report.txt中包含大量的信息,可以帮助用户来优化应用,内存和I/O。其包含有关于
  共享区(数据字典和库高速缓冲存储器),数据库缓冲器高速缓存,每一事件/登录数据,
  每一表空间/文件/I/O,以及等待事件的统计信息。你可以使用全部或其中部分的信息来帮
  助优化。
  优化共享区
  前面我们在讲述“数据库结构”时,我们已经了解到共享区包括两种结构:
  数据库字典缓冲存储器
  库高速缓冲存储器
  这些存储分析的SQL语句供以后重用的区域称为共享SQL区,私有SQL区是在应用内与指示器
  持续时间相关的区域。共享区是缓存结构的,与其它缓存结构一样,它是常驻内存的数据
  结构。
  优化共享区是内存优化和应用优化的重叠区域。
  当Oracle使用过一个SQL语句之后,它在库缓存中为这个语句安排一个区域,并按字符保存
  这个语句。当发生重用时,只有完全相同的语句才能重用。例如,以下语句,在Oracle缓
  存看来是不同的:
  SELECT * FROM EMPLOYEES;
  SELECT    *  FROM  EMPLOYESS;
  SELECT * FROM employees;
  虽然上面三个语句在功能上完全相同,但是由于多个空格的存在和大小写不同,因此,在
  字序上,它们是不同的。
  提高库高速缓冲存储器指南:
  I.尽量减少应用中不必要的分析调用    分析占用大量的CPU时间,同时由于缓冲和缓存
  的引入,它也占用了大量内存。运行SQL TRACE/TKPROF,并检查Parse列的值是否很接近E
  xecute(或Fetch)的值,如果是这样,那么应用对所有的操作都进行重新分析。
  II 最大限度地重用那些被分析的语句  这一点我们在前面已经提过。
  把经常用到的程序固定在内存中   在Oracle中,一个指示器(或称光标)、触发器、过程
  或程序包,可以通过使用一个特殊的共享区包,DBMS_SHARED_POOL而保留在内存中。为了
  创建这个程序包,你可以运行$ORACLE_HOME/rdbms/admin/dbmspool.sql。为了固定一个程
  序对象,使用如下语句:
  SQL>EXECUTE DBMS_SHARED_POOL.KEEP(‘’);
  为了释放它,使用如下语句:
  SQL>EXECUTE DBMS_SHARED_POOL.UNKEEP(‘);
  判断这个对象是否被钉住,使用如下语句:
  SQL>SELECT SUBST(NAME,1,25),KEPT FROM V$DB_OBJECT_CACHE
  如果这个对象被固定,则KEPT列的值是YES,否则为NO。
  减少库缓存中的碎片  用户的应用可能会出现ORA-04031号错误(没有足够的连续空闲空间
  )。解决这个问题的一个方法是固定内存中经常使用的大对象,而为那些不经常使用的对
  象保留一定空间。这需要在init.ora中设置SHARED_POOL_RESERVED_SIZE和SHARED_POOL_R
  ESERVED_MIN_ALLOC,实际确保那些必须的大对象可以找到空间。将SHARED_POOL_RESERVED_SIZE设为同时装载的
  对象字节长度之和。SHARED_POOL_RESERVED_MIN_ALLOC设置为由SHARED_POOL_RESERVED_S
  IZE指定的保留区最小的分配单元。为了确定一个你想在保留区中包含的特定对象的大小,
  使用以下语句:
  SQL>SELECT SUBSTR(NAME,1,25) “Name”,SHARABLE_MEM
  2   FROM V$DB_OBJECT_CACHE
  3   WHERE NAME=’’;
  另外,为了确定SHARED_POOL_RESERVED_SIZE值大小使用如下语句:
  SQL>SELECT SELECT SUBSTR(NAME,1,25) “Name”,SHARABLE_MEM
  2   FROM V$DB_OBJECT_CACHE
  3   WHERE SHARABLE_MEM> ;
  以上查询输出,再增加适当比例,例如10%,设置SHARED_POOL_RESERVED- SIZE。
  共享区的数据字典部分保存着Oracle数据的缓存结构。参数SHARED_POOL_SIZE是确定
  数据字典本身的唯一途径。对库缓存所做的一切都会影响到数据字典缓存,因为它们是共
  享区的,它们不能完全独立地进行配置。
  有两种办法可以测量数据字典缓存的性能,其中一种方法是对V$ROWCACHE进行如下查询:
  SELECT SUM(GETMISSES)/SUM(GETS) “DC_MISS_RATIO”
  FROM V$ROWCACHE;
  另一个办法是使用report.txt中的数据字典段,计算所有的GET_MISS和GET_REQS,以得到
  一个类似的DC_MISS_RATIO。如果这两种办法的任一种显示: DC_MISS_RATIO>.15,就增加
  SHARED_POOL_SIZE(并重新进行测试)。
  多线程服务器问题(MTS)
  在多线程服务器中,存在着针对客户(用户)内存分配服务器内存问题。正如存在一个SG
  A一样,也存在一个User Global Area(UGA),它包括用户任务信息,排序区域和私有SQL区
  。一般情况下,缺省Oracle RDBMS应用会在用户进程与服务器之间采用一种一一对应的方
  式。在MTS上,UGA存在于共享区中,其它由各进程使用的内存保留在PGA中。
  我们可以使用下面的语句来确定被重新定位到SGA的UGA的大小:
  SELECT SUM(VALUE)
  FROM V$SESSTAT SE,V$STATNAME SN
  WHERE SN.NAME = ‘session uga memory max’
  AND SE.STATISTIC# = SN.STATISTIC#;
  这个查询自实例启动以来,使用最大数量的UGA会话内存。你应该随时对这个值进行采样,
  并跟据这个值增加SHARED_POOL_SIZE的值。
  在MTS中,有两个init.ora参数影响到用户内存:
  SESSION_CACHED_CURSORS
  CLOSE_CACHED_OPEN_CURSORS
  若想要的话,将SESSION_CACHED_CURSORS设置为缓存在用户内存区域中的会话指示器的最
  大期望值。
  CLOSE_CACHED_CURSORS的缺省值为FALSE,它意味着在COMMIT命令出现时,指示器不关闭。
  如果语句少重用,将其设为TRUE。
  优化数据库缓冲区高速缓冲存储器
  在提高Oracle数据库性能方法,正确设置数据库缓冲区高速缓冲存储器的大小,可能是最
  重要的一个措施。数据库缓冲区高速缓冲存储器是SGA中保留内存最为经常使用的Oracle数
  据块拷贝的存储区域。以下两个参数确定这个区的大小:
  DB_BLOCK_SIZE
  DB_BLOCK_BUFFER
  DB_BLOCK_SIZE是Oracle块的大小,它们取值范围是2的N次方KB。一般来说这个值越大,对
  性能越有利。如果数据库已建立,并且已采用相对较小的块,则可以靠在方便的情况下通
  过以下过程重建数据库:
  关闭实例
  将数据库全部输出
  在init.ora中增加DB_BLOCK_SIZE值
  启动实例
  重新输入数据库
  这是比较令人头疼的操作,所以在创建数据库时就应当比较慎重地考虑好DB_BLOCK_SIZE的
  值。
  DB_BLOCK_BUFFERS是在内存中保留的Oracle块的数量,每个缓冲器的大小为一个块的
  大小。这个值应足够高以保证有效地击中高速缓冲存储器,但不应过高,从而导致操作系
  统页交换。页交换是Oracle的基本工作,你显然不想让操作系统页交换来影响Oracle的工
  作。为了保证数据库缓冲区和共享区在实际内存中有一个较大的击中,SGA就应为实际内存的1/2到3/4。
  数据库缓冲区高速缓冲存储器的大小为:
  DB_BLOCK_BUFFERS * DB_BLOCK_SIZE
  它高速缓冲数据而不是程序,因而不同于共享区。
  我们来看一下用户I/O请求时缓冲区的管理过程:
  用户选择数据块(请求块)
  服务器在数据库缓冲区缓存中查找数据。
  如果(通过散列函数)在最近最少使用(LRU)列中找到就返回。
  如果没找到,它从硬盘的数据文件中读取数据,并(使用散列函数)将其粘在最近最少使
  用(LRU)列表的最近经常使用(MRU)或LRU端。
  如果用户不修改数据,过程结束。
  用户修改数据DBWR将此块写回硬盘。
  索引每次只访问一个块,全表扫描则可能一次访问多块。可以通过以下设置来决定多块访
  问的数量:
  DB_FILE_MULTIPLE_BLOCK_READ_COUNT=
  缓冲区有几种状态:
  free(clean)  从应用启动以来,从未使用过,或曾经被使用过,现在又可作用的缓冲区
  。
  Dirty      曾经被使用过,但还没有被清除出缓冲区或在检查点上被DBWR写出。
  Current    被insert、update或delete使用的缓冲区。
  Read-consistent  被SELECT或撤消所使用的缓冲区。
  现在为止,我们已前对数据库缓冲区缓冲存储器有较深入的了解,那么怎么来优化它呢
  ?由于内存I/O比磁盘I/O快几个数据级(ns对ms),所以我们希望经常(90%以上的机会)
  从数据库缓冲区高速缓存中访问块,而不是从磁盘读取块。另外,我们还想使LRU锁存锁竞
  争最小。
  我们至少有两种办法来测量数据库缓冲区缓存击中率:
  SELECT 1-(P.VALUE/(D.VALUE+C.VALUE)) “CACHE HIT RATIO”
  FROM V$SYSSTAT P,V$SYSSTAT C,V$SYSSTAT D
  WHERE P.NAME=’physical reads’
  AND D.NAME=’db block gets’
  AND C.NAME=’consistent gets’;
  以上实际使用的击中率计算公式是:
  1-(physical reads/logical reads)
  从report.txt的statistics段中收集相应的物理读,db块读取和一致性读取,使用同一公
  式计算击中率。
  如果击中率小于90%, 增加DB_BLOCK_BUFFERS,并重启,再次检查击中率进行调整。
  优化排序
  排序消耗大量CPU时间、内存和硬盘空间。
  我们的第一个策略是:尽量避免不必要的排序,当无可避免排序时,则应优化排序,使其
  优化执行。在内存排序是最理想的,但是对于某些大表,在硬盘上进行排序是不可避免的
  ,这会消耗大量时间。
  我们的第二个策略是:尽可能地在内存中进行排序,只在绝对必要时在磁盘上进行排序。
  当然,这意味着分配足够的临时磁盘空间(实质上,是TEMP表空间),并将这一空间与Or
  acle数据库文件、回滚段和重做日志文件从物理上分开。
  以下SQL命令或操作它们可以触发排序:
  CREATE INDEX,ALTER INDEX …REBUILD
  ORDER BY,GROUP BY
  DISTINCT
  UNION, INTERSECT, MINUS
  IN, NOT IN
  排序参数
  在init.ora中,有两个重要的参数影响排序操作:
  SORT_AREA_RETAINED:用于内存排序的最大内存数。
  SORT_AREA_SIZE:用于外部磁盘排序的最大内存数,涉及到临时段的分配。
  如果一个排序操作对内存的需求超过SORT_AREA_RETAINED_SIZE的规定,它就会尝试在SOR
  T_AREA_SIZE规定的范围内进行外部磁盘排序,并在进程中分配多个临时段。若排序操作要
  求更多的内存,则它将排序任务分为多个排序运行,并为此分配多个临时段。
  使用EXPLAIN PLAN,你会发现很多SQL语句在它们执行计划中可能要求多个排序,当前正在
  进行的排序称为活动排序,支持连接操作的排序称为连接排序。活动排序要求SORT_AREA_
  SIZE,任何连接排序要求SORT_AREA_RETAINED_SIZE。
  对于多线程序服务器,设置SORT_AREA_RETAINED远小于SORT_AREA_SIZE。作为一个参考
  :SORT_AREA_RETAINED_SIZE= (SORT_AREA_SIZE/期望并发的排序数),但不小于1/10(SO
  RT_AREA_SIZE)。
  当排序不能全部在内存中进行时,就必须创建临时(排序)段。也就是说,排序操作的
  内存要求超过SORT_AREA_RETAINED_SIZE的设置时,它要求分配临时段,并试图在SORT_AR
  EA_SIZE之内工作。利用CREATE 或ALTER TABLESPACE  TEMPORARY …
  语法创建临时段空间。这些临表空间由一个段组成,最初由要求它的第一个排序创建。
  在SGA中,称作Sort Extend Pool(SEP)的内存结构包括组成属于临时表空间的单个排序段
  的范围(extent)。在一个进程请求排序空间时,这个区提供空闲范围以便重新使用。此
  外,V$SORT_SEGMENT包含信息,如使用临时排序段的用户、范围、和块数。你可以使用这
  个确定击中率并帮助确定范围的大小。
  Oracle可以让排序旁路数据库缓冲区高速缓冲存储器。这被称作为排序直接写。当然,你
  仍然需要SORT_AREA_SIZE字节,但每一排序操作会有它自己的内存缓冲区并直接将它们写
  入磁盘。缓冲器由init.ora参数SORT_WRITE_BUFFERS设置(2-8),缓冲器数有SORT_WRIT
  E_BUFFER_SIZE(设置32K至64K)。每一标准排序操作要求一Sort Direct Writes Buffer,其大小为
  (SORT_WRITE_BUFFERS *SORT_WRITE_BUFFER_SIZE)+SORT_AREA_SIZE
  init.ora参数SORT_DIRECT_WRITEES确定排序行为而不管使用数据库缓冲区高速缓冲存储器
  与否。若设置为缺省值AUTO,且若SORT_AREA_SIZE>= 10* Sort Direct Writes Buffer,
  则使用Sort Direct Writes Buffer。若设置为FALSE,则排序写在磁盘之前缓冲在数据库
  缓冲区高速缓冲存储器中。这些是正常的排序缓冲缓冲写。若设置为TRUE,则排序写始终是排序直接写。VLDB,
  DSS和Data Warehouse应该正常地将这个参数设置为TURE(或至少为缺省值AUTO)。
  四.优化I/O
  Oracle中优化I/O主要是优化组成数据库的段(表格和索引)的物理结果,它们包括由
  范围(extent)组成,自然也是由块组成的表空间和数据文件。
  Oracle数据库管理I/O意味着读和写。从数据库角度来看,特别是从DML角度来看,SELECT
  一般是读操作,INSERT、UPDATE和DELETE是写操作;DDL(CREATE、ALTER、DROP)始终是
  写操作。
  在Oracle中考虑优化I/O时,不仅要考虑优化表空间、范围(extent)、块和数据文件,还
  要考虑优化回滚段和重做日志(因为用户DML产生所有种类的I/O)。下面逐一介始每种I/
  O的优化。
  1.优化表空间和数据文件
  通过前面的学习,我们知道:表空间是进行物理存储的Oracle结构,表空间存储一群段―
  ―表格和格引。表空间在操作系统级映射到一个或多个数据文件上。
  优化表空间和数据文件的一条重要原则就是我们以前提到的分而治之。具体来讲就是将表
  空间(及其数据文件)尽可能地分放在不同的磁盘上。将表空间分放在不同磁盘上可以消
  除或者至少减少磁盘竞争。
  划分表空间
  划分表间就是尽可能将各表空间分放在不同的磁盘上,有可能的话:
  SYSTEM位于一单独的磁盘上。
  TEMP至少位于N个磁盘上。
  DATA1至DATAN位于N个磁盘上。
  INDEX1至INDEXN位于N个磁盘上。
  ROLLBACK至少位于N个磁盘上。
  记位:初始创建用户时,一个用户的缺省表空间和缺省暂存表空间指向SYSTEM,若它们没
  有被正确地创建,通过执行下列语句改变这些:
  ALTER USER 
  DEFAULT TABLESPACE 
  DEFAULT TEMPORARY TABLESPACE ;
  为了用户避免在SYSTEM表空间生成对象,任何关于系统的限额必须取消使用:
  ALTER USER  QUOTA 0 ON SYSTEM;
  我们按表的访问频度将表格分类――活动分类,换言之,按它们的活动程度分类:
  若一个表格活动非常频繁,则称之为热门表格,对于一个表格内的列的活动列同样成立,
  这也被称为热门列。
  相对热门组件而言,活动一般的表格或列被称为温和表格或列。
  不常被访问的组件(表格或列),称为冷门组件。
  H    高活动,或热门
  M    中活动,或温和
  L     低活动,或冷门
  虽然这是一个简单的分类,但这将有助于您的物理设计和性能优化。例如:高活动的DML表
  格将导致高碎片。若存储在它们自己的单独的表空间或磁盘上,这会阻止它们导致低活动
  表格的不必要碎片。
  分类工作结束后,我们可以按以原则划分表格和索引。
  将每一个热门表格/索引放在它自己的单独的表空间/磁盘上。
  将每一个温和表格/索引放在它自己的单独的表空间/磁盘上。
  将每一个冷门表格/索引放在它自己的单独的表空间/磁盘上。
  始终将合并表格/索引放在它自己的单独的表空间/磁盘上。
  将数据和索引表空间分开。
  将您最热门的表空间放在你最快的磁盘上,将最冷门的表空间放在最慢上的磁盘上。
  若有必要,由于磁盘空间限制的原故,将温和表格/索引和冷门表格/索引放在同一表空间
  或磁盘上。
  若非并发访问,将“类似”的表格/索引放在同一表空间/磁盘上。
  另外成簇还为存储频繁的合并的表格而提供一个可选存储方案。(参阅前面P27、P28)。
  监控
  虽然我们已经看到了帮助减少热门表格竞争的准则和成簇,但我们如何告知哪一个表
  空间是热门表空间呢?在应用早期建模时,若你有一个良好的估计,即良好的事务分析计
  算,你就有一个好的开端,并应该使用这些计算指导你的初始物理设计。
  我们也可以使用Oracle备用工具帮助实施监控:V$动态性能视图和utlbstat.sql/ utlb
  estat.sql正确运行时的report.txt输出。
  在V$DATAFILE和V$FILESTAT视图作以下查询:
  SELECT NAME,PHYSRDS,PHYSWRTS
  FROM V$DATAFILE DF,V$FILESTAT FS
  WHERE DF.FILE#=FS.FILE#;
  或在report.txt的I/O部分检查PHYS_READ和PHYS_WRITES。物理读和物理写次数之和是总的
  文件或表空间I/O次数。
  (结束时的I/O次数 -开始时的I/O次数)/ 时间   = I/O频度
  我们应尽可能地平衡I/O――实质上,在全部磁盘之间分担I/O。
  2. 优化块和范围
  Oracle按范围组织,而范围组成表空间。它们是存储表空间的物理基础。因此,我们
  访问其中的数据并管理它们的增长越有效,我们的性能就越好。
  使用预分配
  我们知道,动态分配开销太大,并且有损I/O性能。在差不多的情况下均优选静态分配
  。你可以静态地预分配一个段(表格或索引)或一个表空间。
  前面介绍中,我们已经知道了一些存储数的含义,现在让我们来简单地观察一下同一表
  空间存储两个不相同表格的两种不同方法,假设你有两个表格,每一个表格要求最大空间
  为100MB。让我们来创建具有单个数据文件的256M表空间,从而使能一些额外的增长。
  第一个方法:预分配表空间。
  CREATE TABLESPACE ts1 
  DATAFILE ‘/data1/file1.dat’ SIZE 256M
  STORAGE (INITIAL 100M NEXT100M MINEXTENTS 2);
  CREATE TALBE t1 (a number(8), … , z number(8))
  TABLESPACE ts1;
  CREATE TABLE t2 (a number(9),….,z number(9))
  TABLESPACE ts1;
  第二种方法:预分配表格。
  CREATE TABLESPACE ts1
  DATAFILE ‘/data1/file1.data’ SIZE 256M;
  CREATE TALBE t1 (a number(8), … , z number(8))
  TABLESPACE ts1
  STORAGE (INITIAL 100M NEXT 10M MINEXTENTS 1);
  CREATE TABLE t2 (a number(9),….,z number(9))
  TABLESPACE ts1
  STORAGE (INITIAL 100M NEXT 10M MINEXTENTS 1);
  通过以上比较,我们可以看出,预分配表格明显地给我们更细粒度地控制增长以及与该
  表空间关联的性能。一般来讲,预分配的存储单元越细,性能越好。
  使用Oracle分离
  Oracle分离本质上讲是一种范围(extent)预分配形式,以便每一范围占据它的全部对应
  数据文件,它很方便地位于一个单独的磁盘上。假设你有一个活动性极高的表格要分离,
  其峰值规模小于600M,并且你可以使用三个盘对其进行分离,则可以用以下方式创建:
  CREATE TABLESPACE ts1
  DATAFILE ‘/data1/file1.dat’ SIZE 200M,
  DATAFILE ‘/data2/file2.dat’ SIZE 200M,    
  DATAFILE ‘/data3/file3.dat’ SIZE 200M;
  CREATE TABLE t1 (a varchar2(25),…,z varchar2(25))
  TABLESPACE ts1
  STORAGE (INITIAL 198M NEXT 198M MINEXTENTS 3 PCINCREASE 0);
  避免碎片
  在一个表空间内分配和释放范围时会出现范围碎片。虽然碎片一般主要作为空间问题考虑
  ,但它象数据系统的全部事情一样,会影响性能。
  使用下列语句帮助确定表格碎片的程度:
  SELECT  SEGMENT_NAME,COUNT(TABLESPACE_NAME)
  FROM DBA_EXTENTS
  WHERE EXTENTS>4
  ORDER BY EXTENTS;
  如果返回任何段,考虑这些太零碎了,为了优化这一点,你可以选择新的存储参数创建
  又一个表格,重建。
  使用下列语句帮助确定你的自由碎片程度:
  SELECT TABLESPACE_NAME,COUNT(TABLESPACE_NAME)
  FROM DBA_FREE_SPACE
  ORDER BY TABLESPACE_NAME
  GROUP BY TABLESPACE_NAME
  HAVING COUNT(TABLESPACE_NAME)>10;
  若返回任何表空间,考虑这些表空太零碎了。执行ALTER TABLESPACE   COALSCE语句以帮助调整这个表空间。然后重新运行查询。若有些表空间仍然碎片很多(
  大于5*段数),则你可能可考虑重建。
  为了使SMON能合并表空间的自由空间,无论是自动还是通过ALTER命令,表空间必须让
  它的PCTFREE>0。然后,这可能导致表空间中的表格按几何级数增长,除非表格替换PCTFR
  EE设置。建议:对表空间设置PCTFREE为1,对表格设置为0。
  优化回滚段
  回滚段是或多或少的随机I/O组件,它们由DBWR并发地写,缓冲在数据库高速缓冲器高速缓
  存中,并且存放在特殊化的表空间。回滚段之间以及回滚段和其它诸如数据表空间之间之
  类的数据库I/O组件之间都会存在竞争。如何检测这一竞争呢?可以使用以下语句:
  SELECT CLASS,COUNT
  FROM V$WAITSTAT
  WHRE CLASS LIKE ‘%undo%’
  AND COUNT>0;
  或  SELECT USN,WAITS
  FROM V$ROLLSTAT
  WHERE WAITS>0;
  或从report.txt的回滚段部分检查TRANS_TBL_WAITS>0的UNIDO_SEGMENT。你还可以查看
  report.txt的System wide wait events部分找到%undo%事件,或者从视图V$SYSTEM_EVEN
  T中选择这些事件。另外,若你遇到ORA-01555:snapshot too old错误,则你已经用完了
  回滚。你需要更多的回滚段,更大的回滚段,或两者。
  对于超大型的数据库或对于极高的查询并发数据库(如一些DSS系统),若V$ROLLSTAT
  的WAITS/GETS或TRANS_TBL_WAITS/TRANS_TBL_GETS比率>1%,则可能是一个回滚段竞争问题
  。分配回滚段数为并发用户和程序数据除以4,最高为50。
  下面我们给出一些回滚段的优化建议:
  设置INITIAL=NEXT,PCTINCREASE为0。
  设置MINEXTENTS>=20以便INITIAL*MINEXTENTS较表空间(数据文件)大小约低于1%以防支
  态扩展。
  设置OPTIMAL=INITIAL*MINEXTENTS以阻止不必要的回滚段收缩。
  对于小事务(小事务指产生少量撤消信息的事务,一般在OLTP系统中找到),使用高达5
  0个回滚段,并且尽可能在应用内频繁地提交。大型事务(一般在批处理系统中找到)要求
  单个大规模回滚段,对于这种情况,不必需要许多回滚段,一个大规模回滚段就够了。使
  用
  SET TRANSACTION USE ROLLBACK SEGMENT ;
  确保运行时间特别长的事务(大型事务)使用特别大的回滚段。
  4. 优化重做日志
  重做日志是顺序的I/O组件。一个时刻它们只被LGWR写一次,被缓冲存SGA的一个单独
  部分(日志缓冲器)中,并且存作OS文件。因此,重做日志之间没有竞争,只有重做日志
  与其他组件之间的竞争。
  LGWR进程在发生下列事件之一时写向重做日志(本质上讲,是完成日志清仓):
  COMMIT,提交
  CHECKPOINT,DBWR数据库清仓
  检查点超时(时间间隔为LOG_CHECKPOINT_INTERVAL)或者日志缓冲器使用超过1/3。
  下面是要达到最小化的一些主要性能优化目标:
  对于给定应用,检查点尽可能多
  重做等待事件尽可能多
  重做锁存竞争问题
  下面是配置检查点机制的建议:
  让成员数不少于2的至少2组在不同的I/O通道(磁盘或控制器)上,每一成员同样大小。
  在init.ora中将CHECKPOINT_PROCESS设置为TURE,以便将文件头同步义务由LGWR进程转给C
  KPT进程。
  Init.ora参数LOG_CHECKPOINT_TIMEOUT=0
  设置LOG_CHECKPOINT_INTERVAL等于OS块中的一个日志大小加上一个OS块。举个例了:全部
  重做日志成员大小为1M,1M=1024K=2048个OS块(一个OS块为512字节)。因些,将CHECKP
  OINT_INTERVAL设置为2048+1,即时2049。这加上LOG_CHECKPOINT_TIMEOUT=0,将使能检查
  点只发生在日志开关边界处,这会大大提高性能。
  如何监控和优化重做等待事件和重做锁存竞争问题呢?在report.txt的Statistics部分检
  查’redo log space request’,在report.txt的System Wide Wait events部分检查’l
  og file space/switch’。另外,还可以使用v$SYSSTAT和V$SYSTEM_EVENT视图分别查看这
  些事件。
  若这些事件中的任何一个远大于0,这表示LOG_BUFFER的值太小。将它提高5%或更多,让你
  的应用运行一段时间,并再次查询这些测量。重复这一过程直至这些事件为0或非常接近0
  。
  第八章:卸库与装库
  一.卸库与装库的功能、及异同
  二.操作方法
  交互式卸库与装库:无参数调用
  参数驱动方式的卸库与装库
  Parfile关键字参数
  交互式与参数驱动式混合使用
  三. 卸库与装库方式
  表方式
  用户方式
  全库方式
  方式转换
  方式使用
  四.错误情况及解决办法
  ORACLE不运行
  读取DBA创建的卸库文件
  3.不启动全库方式卸库          
  第九章:备份与恢复
  一.由备份提供的保护措施
  保护丢失的对象
  保护丢失的数据库
  二.ORACLE企业管理器备份
  Backup Wizard
  数据库打开时的备份
  三.卸库与装库备份
  具有足够长的空闲时间
  空闲时限不够长
  从卸库文件恢复
  四.映象备份
  1.冷备份
  2.热备分
  五.恢复
  第十章:连接Internet应用(ORACLE Web Server)
  一. ORACLE的网络体系结构
  ORACLE网络体系结构简介
  中间件技术
  C/S式和S/B式
  CORBA
  二.ORACLE数据库连到Web Server
  三.Web Listener
  四.Web Application Server
  五.DAD Administrator
  六.Web请求代理
  附:参考资料:
  轻松掌握Oracle8数据库开发    David Lockman 著, 电子工业出版社 
  ORACLE数据库系统基础       俞盘祥  编著,清华大学出版社
  数据库管理及应用开发         沈佩娟  汤荷美编著,清华大学出版社
  Oracle7与客户/服务器计算技术从入门到精通       电子工业出版社
  Oracle8初学者指南            Oracle Press,机械工业出版社
  Oracle8数据库管理员手册      Oracle Press,机械工业出版社
  Oracle 8 Server V8.0.4  On-line Generic Documentation CD
  即学即用Oracle8   Willian G.Page Jr, Nathan Hughes  电子工业出版社
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics