li
  当前位置:主页 > 性能优化 > 文章内容
li
我的oracle笔记,欢迎收看!(8)
来源: www.ixdba.net  作者: Oracle+Linux专业技术门户    时间:2008-01-24   阅读:53  
本文章共57013字,分8页,当前第8页,快速翻页:
 
提示明确进行执行规划的选择,将几个单列索引的扫描合起来.
  
例如:
   SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='CCBZZP' AND DPT_NO='TDC306';

 <15>. /*+USE_CONCAT*/
  
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.
  
例如:
   SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

 <16>. /*+NO_EXPAND*/
  
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.
IXDBA.NET社区论坛
  
例如:
   SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE  DPT_NO='TDC506' AND SEX='M';

 <17>. /*+NOWRITE*/
  
禁止对查询块的查询重写操作.

 <18>. /*+REWRITE*/
  
可以将视图作为参数.

19>. /*+MERGE(TABLE)*/
  
能够对视图的各个查询进行相应的合并.
  
例如:
   SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
   ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
   AND A.SAL>V.AVG_SAL;

 <20>. /*+NO_MERGE(TABLE)*/
  
对于有可合并的视图不再合并.
  
例如:
   SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
   ,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
   AND A.SAL>V.AVG_SAL;
  
 <21>. /*+ORDERED*/
  
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.
  
例如:
   SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C
   WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

 <22>. /*+USE_NL(TABLE)*/
  
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
  
例如:
   SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

 <23>. /*+USE_MERGE(TABLE)*/
  
将指定的表与其他行源通过合并排序连接方式连接起来.
  
例如:
   SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE
   BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

 <24>. /*+USE_HASH(TABLE)*/
  
将指定的表与其他行源通过哈希连接方式连接起来.
  
例如:
   SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE
   BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

 <25>. /*+DRIVING_SITE(TABLE)*/
  
强制与ORACLE所选择的位置不同的表进行查询执行.
  
例如:
   SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

 <26>. /*+LEADING(TABLE)*/
  
将指定的表作为连接次序中的首表.
  
 <27>. /*+CACHE(TABLE)*/
  
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
  
例如:
   SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM  BSEMPMS;

 <28>. /*+NOCACHE(TABLE)*/
  
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
  
例如:
   SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM  BSEMPMS;

 <29>. /*+APPEND*/
  
直接插入到表的最后,可以提高速度.
   insert /*+append*/ into test1  select * from test4 ;
  
  insert /*+append */ into emp nologging

 <30>. /*+NOAPPEND*/
  
通过在插入语句生存期内停止并行模式来启动常规插入.

   insert /*+noappend*/ into test1  select * from test4 ;
 <31>.parallel direct-load insert
  sql> alter session enable parallel dml;
  sql> insert /*+parallel(emp,2) */ into emp nologging
  sql> select * from emp_old;

如何快速杀死占用过多资源(CPU,内存)的数据库进程?

很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:
alter system kill session 'sid,serial#';



但是此命令释放资源极为缓慢,具体可以参考:OracleKill session的研究.
为了更快速的释放资源,通常我们使用如下步骤来Kill进程:
1.
首先在操作系统级kill进程
2.
在数据库内部kill session
这样通常可以快速中止进程,释放资源。

今天就遇到这样一个案例,其他朋友在数据库里kill session,可是长时间仍无效果:
[oracle@danaly ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 27 11:09:50 2005

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

SQL> select sid,username,status from v$session;

SID USERNAME STATUS
---------- ------------------------------ --------
....
154 SCOTT KILLED
...

30 rows selected.



那按照我前面提到的步骤,首先查询得到该session对应的OS进程号:
SQL> select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid);
Enter value for sid: 154
old 1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid)
new 1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=154)

'KILL-9'||SPID
--------------------
kill -9 22702

SQL> !



在操作系统级kill该进程:
[oracle@danaly ~]$ ps -ef|grep 22702
oracle 22702 1 0 Oct25 ? 00:00:02 oracledanaly (LOCAL=NO)
oracle 12082 12063 0 11:12 pts/1 00:00:00 grep 22702
[oracle@danaly ~]$ kill -9 22702
[oracle@danaly ~]$ ps -ef|grep 22702
oracle 12088 12063 0 11:12 pts/1 00:00:00 grep 22702
[oracle@danaly ~]$ exit
exit

SQL> select sid,username,status from v$session;

SID USERNAME STATUS
---------- ------------------------------ --------
...
154 SCOTT KILLED
...

30 rows selected.

SQL> select sid,serial#,username from v$session where sid=154;

SID SERIAL# USERNAME
---------- ---------- ------------------------------
154 56090 SCOTT



再次在数据库中killsession,并指定immediate选项:
SQL> alter system kill session '154,56090' immediate;

System altered.

SQL> select sid,serial#,username from v$session where sid=154;

no rows selected

此时该进程被迅速清除。



阅读更多内容<<上一页 · 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8


  上一篇: 案例解决:一次oracle掉电的处理...   下一篇: 如何确定导致刷新组刷新失败的物...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·案例解决:一次oracle掉电的处理...
·阿里巴巴公司DBA笔试题
·Oracle数据库ASM功能详解
·Java用OCI驱连Oracle数据库的实现...
·oracle问题小结一:ORACLE常见错...
·Oracle优化经典文章--磁盘I/O和碎...
·案例分析:ORA-25153: Temporary...
·案例分析:ORA-12500错误案例
·案例分析:ORA-01461错误
·案例分析:ORA-01178错误释疑
·如何确定导致刷新组刷新失败的物...
·添加字段对SQL的影响
·使用当前用户的数据库链的实现
·如何确定导致刷新组刷新失败的物...
·函数索引产生隐藏列
·ORA-600(ktsircinfo_num1)错误
·Oracle10201在Enterprise Linux ...
·表异常增大的bug
·数据库升级造成的X_$BH状态异常问...
·9i上使用CONNECT BY访问DUAL表的...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接