当前位置:首页>>开发编程>>数据库>>新闻内容
ORACLE常用傻瓜問題1000問(之五)
作者:CCBZZP 发布时间:2003-10-16 22:33:53 文章来源:CSDN

        大家在應用ORACLE的時候可能會遇到很多看起來不難的問題, 特別對新手來說, 今天我簡單把它總結一下, 發布給大家, 希望對大家有幫助! 和大家一起探討, 共同進步!

 

        對ORACLE高手來說是不用看的.


   本讲主要讲的是SQL语句的优化方法! 主要基于ORACLE9I的.
174. /*+ALL_ROWS*/
   表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
   例如:
   SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

175. /*+FIRST_ROWS*/
   表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
   例如:
   SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE    EMP_NO='CCBZZP';

176. /*+CHOOSE*/
   表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
   表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
   例如:
   SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';

177. /*+RULE*/
   表明对语句块选择基于规则的优化方法.
   例如:
   SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';  

178. /*+FULL(TABLE)*/
   表明对表选择全局扫描的方法.
   例如:
   SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='CCBZZP';

179. /*+ROWID(TABLE)*/
   提示明确表明对指定表根据ROWID进行访问.
   例如:
   SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
   AND EMP_NO='CCBZZP';

180. /*+CLUSTER(TABLE)*/
   提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.
   例如:
   SELECT  /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
   WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

181. /*+INDEX(TABLE INDEX_NAME)*/
   表明对表选择索引的扫描方法.
   例如:
   SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE    BSEMPMS */  FROM BSEMPMS WHERE SEX='M';

182. /*+INDEX_ASC(TABLE INDEX_NAME)*/
   表明对表选择索引升序的扫描方法.
   例如:
   SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */  FROM BSEMPMS WHERE DPT_NO='CCBZZP';

183. /*+INDEX_COMBINE*/
   为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的
   布尔组合方式.
   例如:
   SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
   WHERE SAL<5000000 AND HIREDATE<SYSDATE;

184. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
   提示明确命令优化器使用索引作为访问路径.
   例如:
   SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
   FROM BSEMPMS WHERE SAL<60000;

185. /*+INDEX_DESC(TABLE INDEX_NAME)*/
   表明对表选择索引降序的扫描方法.
   例如:
   SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */  FROM BSEMPMS WHERE    DPT_NO='CCBZZP';

186. /*+INDEX_FFS(TABLE INDEX_NAME)*/
   对指定的表执行快速全索引扫描,而不是全表扫描的办法.
   例如:
   SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';

187. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
   提示明确进行执行规划的选择,将几个单列索引的扫描合起来.
   例如:
   SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='CCBZZP' AND DPT_NO='TDC306';

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

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

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

191. /*+REWRITE*/
   可以将视图作为参数.

192. /*+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;

193. /*+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;
  
194. /*+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;

195. /*+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;

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

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

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

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

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

202. /*+APPEND*/
   直接插入到表的最后,可以提高速度.
   insert /*+append*/ into test1  select * from test4 ;
203. /*+NOAPPEND*/
   通过在插入语句生存期内停止并行模式来启动常规插入.

   insert /*+noappend*/ into test1  select * from test4 ;

   
   待续...


最新更新
·SQL Server 2005删除用户失败
·SQL Server中删除重复数据的
·经典SQL语句大全
·SQL Server 2005与ASP.NET/A
·三种查看MySQL数据库版本的方
·SQL Server 2005 Express 远
·启用SQL Server 2005 Expres
·Windows下如何安装或卸载MyS
·解决MySQL5数据库连接超时问
·清除SQL Server日志的两种方
相关信息
·2008主流数据库产品回顾与展望
·安装Oracle后配置和启动企业管理器的方法
·简单介绍Oracle 9i的16种数据类型
·如何在Oracle中导入dmp数据库文件
·把Oracle查询转换为SQL Server
·轻松修改Oracle数据库表的大小
·实例讲解Oracle里抽取随机数的多种方法
·Oracle在Linux操作系统下的安装小结
·用Oracle8i修复数据库坏块的三种方法
·在Oracle中导出、导入dmp数据库文件
画心
愚爱
偏爱
火苗
白狐
画沙
犯错
歌曲
传奇
稻香
小酒窝
狮子座
小情歌
全是爱
棉花糖
海豚音
我相信
甩葱歌
这叫爱
shero
走天涯
琉璃月
Nobody
我爱他
套马杆
爱是你我
最后一次
少女时代
灰色头像
断桥残雪
美了美了
狼的诱惑
我很快乐
星月神话
心痛2009
爱丫爱丫
半城烟沙
旗开得胜
郎的诱惑
爱情买卖
2010等你来
我叫小沈阳
i miss you
姑娘我爱你
我们都一样
其实很寂寞
我爱雨夜花
变心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK绷
贝多芬的悲伤
哥只是个传说
丢了幸福的猪
找个人来爱我
要嫁就嫁灰太狼
如果这就是爱情
我们没有在一起
寂寞在唱什么歌
斯琴高丽的伤心
别在我离开之前离开
不是因为寂寞才想你
爱上你等于爱上了错
在心里从此永远有个你
一个人的寂寞两个人的错