li
  当前位置:主页 > 性能优化 > 文章内容
li
oracle中各种sql语句的多种写法
来源: www.HelloDBA.com  作者: fuyuncat    时间:2008-03-30   阅读:35  
本文章共3142字,分3页,当前第1页,快速翻页:
 

   记录一下常用sql语句的多种写法,顺便复习一下sql语句!     

   最近处理的问题涉及SQL Tuning的东西比较多。不少语句不是加几个索引这么简单,而是语句是在太复杂了,有些作者都不知道是谁,逻辑非常难理解。碰到这种情况着实令人头疼。但是根据经验,很多语句的书写方式是可以用其他方式代替,通过尝试修改语句的写法,往往取得不错的效果。

          当然,改变语句的写法只是语句优化的一种手段之一,在这个基础上,在结合其他的优化手段(采用PLSQL块提花单个语句、采用游标、提示等)才能取得最好的优化效果。以下的替换中,大多数情况下,右边的写法会优于左边的写法,并且根据等价原理进行互换,可以在复杂语句中组合成多种写法: 

1.1.1      OR -> IN

SELECT B

FROM T

WHERE C = 1

OR C = 2;

 

=>

 

SELECT B

FROM T

WHERE C IN (1,2);

1.1.2      IN -> EXISTS

SELECT B

FROM T1

WHERE C IN (SELECT C FROM T2 WHERE A=’aaa’);

 

=>

 

SELECT B

FROM T1

WHERE EXISTS (SELECT 1 FROM T2 WHERE A=’aaa’ and T1.C = T2.C);

1.1.3      IN -> JOIN

SELECT B FROM T1
IXDBA.NET社区论坛
WHERE B IN (SELECT B FROM T2);

 

=>

 

SELECT DISTINCT T1.B FROM T1, T2
WHERE T1.B=T2.B

1.1.4      INTERSECT -> JOIN

SELECT B FROM TT1
INTERSECT
SELECT B FROM TT2;

 

=>

 

SELECT DISTINCT T1.B FROM T1, T2
WHERE T1.B=T2.B

1.1.5      DISTINCT -> EXISTS

SELECT DISTINCT T1.B

FROM T1, T2

WHERE T2.A=’aaa’

and T1.C = T2.C;

WHERE EXISTS (SELECT 1 FROM T2 WHERE A=’aaa’ and T1.C = T2.C);

 

=>

 

SELECT B

FROM T1

WHERE EXISTS (SELECT 1 FROM T2 WHERE A=’aaa’ and T1.C = T2.C);

1.1.6      EXISTS -> JOIN

SELECT B

FROM T1

WHERE EXISTS (SELECT 1 FROM T2 WHERE A=’aaa’ and T1.C = T2.C);

 

=>

 

SELECT T1.B

FROM T1, T2

WHERE T2.A=’aaa’

and T1.C = T2.C;

WHERE EXISTS (SELECT 1 FROM T2 WHERE A=’aaa’ and T1.C = T2.C);

1.1.7      NOT IN -> NOT EXISTS

SELECT B

FROM T1

WHERE C NOT IN (SELECT C FROM T2 WHERE A=’ccc’);

 

=>

 

SELECT B

FROM T1

WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE A=’ccc’ AND T1.B = T2.B);

1.1.8      NOT IN/NO EXISTS -> OUTER JOIN + IS NULL

SELECT B

FROM T1

WHERE C NOT IN (SELECT C FROM T2 WHERE A=’ccc’);

 

=>

 

SELECT B

FROM T1 Ta,

(SELECT C FROM T2 WHERE A=’ccc’) Tb

WHERE Ta.C = Tb.C(+)

AND Tb.C IS NULL;

1.1.9      NOT IN/NO EXISTS -> NOT IN + /*+ HASH_AJ */

SELECT B

FROM T1

WHERE C NOT IN (SELECT C FROM T2 WHERE A=’ccc’);

 

=>

 

SELECT /*+ HASH_AJ */B

FROM T1

WHERE C NOT IN (SELECT C FROM T2 WHERE A=’ccc’);

 

优化器缺省是用嵌套循环来处理anti-joins的,但是如果使用了MERGE_AJHASH_AJNL_AJ提示,NOT IN



阅读更多内容1 · 2 · 3 · 下一页>>


  上一篇: Oracle中的Hash Join详解   下一篇: ORA-600 [qmxiUnpPacked2]错误的...
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中的Hash Join详解
·如何将高级复制队列表移出系统(S...
·高级复制的整体规划策略
·oracle 高级复制中ORA-25207错误...
·oracle ORA-01555错误完全解析之...
·根据statspack来获取生成环境中t...
·oracle创建逻辑standby数据库
·oracle ORA-01555错误完全解析
·高级复制下如何强制删除废弃复制...
·Oracle数据库中高级复制的功能介...
·ORA-600 [qmxiUnpPacked2]错误的...
·ORA-01599与max_rollback_segmen...
·ORA-01650:unable to extend rol...
·ORA-01652:unable to extend tem...
·ORA-01578:Oracle data block co...
·Oracle的sql*plus使用小结
·oracle 数据库的启动和关闭深入分...
·ORA-00600:internal error code,...
·ORA-03113:end-of-file on comm...
·Oracle数据库日志文件深入分析
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接