网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.ORACLE内置函数大全.
.ORACLE函数大全.
.Oracle 发布免费开发工具 Raptor.
.oracle初始化参数设置.
.给Oracle数据库打补丁.
.Oracle数据库 监看lock script.
.在Oracle中选取有父子或树状关系.
.Oracle8i在linux下的安装(中文).
.Oracle与F5 Networks共同协手合作.
.浅谈权限管理的对象模型和实现.
.影响Oracle汉字显示的字符集问题.
.Oracle中的用户创建和权限的分配.
.各个平台上调整最大SGA区的方法.
.Oracle 常用技巧和脚本.
.ORACLE FOR SUN SOLARIS 维护手册.
.oracle data pump步骤.
.Oracle 数据库的常用函数列表一览.
.PL/SQL程序结构.
.Bitmap Index 的一点探究.
.tochar和todate是如何使用的?格.

ORACLE学习笔记--性能优化二

发表日期:2008-2-9


10.Oracle什么时候会使用跳跃式索引扫描   这是9i的一个新特性跳跃式索引扫描(Index  Skip  Scan). 例如表有索引index(a,b,c),当查询条件为where  b=?的时候,可能会使用到索引index(a,b,c),如,执行计划中出现如下计划: INDEX  (SKIP  SCAN)  OF  “TEST_IDX“  (NON-UNIQUE)   Oracle的优化器(这里指的是CBO)能对查询应用Index  Skip  Scans至少要有几个条件:   <1>  优化器认为是合适的。   <2>  索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。   <3>  优化器要知道前导列的值分布(通过分析/统计表得到)。
  <4>  合适的SQL语句 等。   11.怎么样创建使用虚拟索引   可以使用nosegment选项,如 create  index  virtual_index_name  on  table_name(col_name)  nosegment;   假如在哪个session需要测试虚拟索引,可以利用隐含参数来处理 alter  session  set  "_use_nosegment_indexes"  =  true;   就可以利用eXPlain  plan  for  select  ……来看虚拟索引的效果,利用@$ORACLE_HOME/rdbms/admin/utlxpls查看执行计划,最后,根据需要,我们可以删除虚拟索引,如普通索引一样 drop  index  virtual_index_name;  
注重:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引,不要用自动跟踪去测试虚拟索引,因为那是实际执行的效果,是用不到虚拟索引的。   12.怎样监控无用的索引   Oracle  9i以上,可以监控索引的使用情况,假如一段时间内没有使用的索引,一般就是无用的索引 语法为: 开始监控:alter  index  index_name  monitoring  usage; 检查使用状态:select  *  from  v$object_usage; 停止监控:alter  index  index_name  nomonitoring  usage;   当然,假如想监控整个用户下的索引,可以采用如下的脚本: set  heading  off set  echo  off set  feedback  off set  pages  10000
spool  start_index_monitor.sql SELECT  “alter  index  “owner“.“index_name“  monitoring  usage;“ FROM  dba_indexes WHERE  owner  =  USER; spool  off set  heading  on set  echo  on set  feedback  on ------------------------------------------------ set  heading  off set  echo  off set  feedback  off set  pages  10000 spool  stop_index_monitor.sql SELECT  “alter  index  “owner“.“index_name“  nomonitoring  usage;“
FROM  dba_indexes WHERE  owner  =  USER; spool  off set  heading  on set  echo  on set  feedback  on   13.怎么样能固定我的执行计划   可以使用OUTLINE来固定SQL语句的执行计划,用如下语句可以创建一个OUTLINE Create  oe  replace  outline  OutLn_Name  on Select  Col1,Col2  from  Table where  .......   假如要删除Outline,可以采用 Drop  Outline  OutLn_Name;
  对于已经创建了的OutLine,存放在OUTLN用户的OL$HINTS表下面,对于有些语句,你可以使用update  outln.ol$hints来更新outline,如   update  outln.ol$hints(ol_name,“TEST1“,“TEST2“,“TEST2“,“TEST1) where  ol_name  in  (“TEST1“,“TEST2“);   这样,你就把Test1  OUTLINE与Test2  OUTLINE互换了,假如想利用已经存在的OUTLINE,需要设置以下参数 Alter  system/session  set  Query_rewrite_enabled  =  true Alter  system/session  set  use_stored_outlines  =  true   14.v$sysstat中的class分别代表什么   统计类别 1  代表事例活动 2  代表Redo  buffer活动
4  代表锁 8  代表数据缓冲活动 16  代表OS活动 32  代表并行活动 64  代表表访问 128  代表调试信息   15.怎么杀掉特定的数据库会话   Alter  system  kill  session  “sid,serial#“; 或者 alter  system  disconnect  session  “sid,serial#“  immediate;   在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程) 在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程
  16.怎么快速查找锁与锁等待   数据库的锁是比较耗费资源的,非凡是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。 这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 可以通过alter  system  kill  session  ‘sid,serial#’来杀掉会话   SELECT  /*+  rule  */  s.username, decode(l.type,“TM“,“TABLE  LOCK“,“TX“,“ROW  LOCK“,NULL)  LOCK_LEVEL, o.owner,o.object_name,o.object_type, s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser FROM  v$session  s,v$lock  l,dba_objects  o WHERE  l.sid  =  s.sid AND  l.id1  =  o.object_id(+) AND  s.username  is  NOT  NULL
  假如发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待,以下的语句可以查询到谁锁了表,而谁在等待。 SELECT  /*+  rule  */  lpad(“  “,decode(l.xidusn  ,0,3,0))l.oracle_username  User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# FROM  v$locked_object  l,dba_objects  o,v$session  s WHERE  l.object_id=o.object_id AND  l.session_id=s.sid ORDER  BY  o.object_id,xidusn  DESC   以上查询结果是一个树状结构,假如有子节点,则表示有等待发生。假如想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN   [Q]  如何有效的删除一个大表(extent数很多的表) [A]  一个有很多(100k)extent的表,假如只是简单地用drop  table的话,会很大量消耗CPU(Oracle要对fet$、uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗: 1.  truncate  table  big-table  reuse  storage;
2.  alter  table  big-table  deallocate  unused  keep  2000m  (  原来大小的n-1/n); 3.  alter  table  big-table  deallocate  unused  keep  1500m  ; .... 4.  drop  table  big-table;   17.如何收缩临时数据文件的大小   9i以下版本采用 ALTER  DATABASE  DATAFILE  “file  name“  RESIZE  100M类似的语句 9i以上版本采用 ALTER  DATABASE  TEMPFILE  “file  name“  RESIZE  100M 注重,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。
上一篇:ORACLE学习笔记--性能优化三 人气:1016
下一篇:oracle性能优化心得 人气:1059
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐