Oracle-->sql语句性能调优


1、数据库表的设计要合理
2、合理的加索引。
3、SQL优化的原理只有一个那就是尽可能的缩小查询范围,这样效率肯定会有提高,而且oracle本身对我们所写的SQL能够优化,所以我们要做的就是尽可能的缩小查询范围.大多数需要优化的SQL都是多表连接的查询,而多表连接也包括横向连接,纵向连接,我们使用最多的就是纵向连接。
横向连接一般是指两个表的字段结构基本一样,要把一个表的数据某些记录变成另一个表的一些记录,即Rows+Rows。纵向连接即我们从A表取一些要查询的字段,从B表取一些要查询的字段,然后将A、B表取出来的表用公共的部分纵向连接起来,即Columns+Columns。

      横向连接语句: select a.column1,a.column2 from tableA a union all select b.column1,b.column2 from tableB b

注意,横向连接时,列个数必须相同,而且相对应的字段列数据类型必须相同。其实你就可以把要union的表认为是一个是另一个复制,完全相同。有人可能会问了,要是我要合并的列的的确有不同的列啊, 或者有一列根本就没有,那你可以采用一下方式
select d.dname,d.loc from dept1 d  union all select '' dname, e.loc  from dept e,看“'' dname”,我们不难发现,可以找个替代品,用空字符串(如果类型是字符串。number类型可给个数字比如 1。若出现特殊情况,可用null代替)代替没有的字段,这样就可以合并了。

      纵向连接语句: select a.column1,a.column2 from tableA a full outer join select b.column3,b.column4 from tableB b on a.aid=b.bid where ......,这是全外连接格式。这个速度的确挺快,但查询可能你不喜欢,因为有些结果行可能你根本不想看到。
一般情况下我们left outer join,right outer join用的比较多,这两个的区别就是left outer join以on后面处在左边的连接字段所对应表为主,right outer join刚好相对。当然你也可以使用left join, right join。在使用过程中还是发现外连接相对快些。
要加快纵向连接查询效率,办法就是嵌套查询。以下是项目中实际的一个例子:

--------------------------------------------------------------------------
Select c.customerid,c.receivedmoney,c.tollcollector,c.receiveddate,c.yearmonth,c.receivedlatefee,c.receivedfee,c.receivedappend,c.jmman,c.jmmoney,c.name,d.chargeint
 from
    (select  a.customerid,a.receivedmoney,a.tollcollector,a.receiveddate,a.yearmonth,a.receivedlatefee,a.receivedfee,a.receivedappend,a.jmman,a.jmmoney,b.name
      from
       (select rf.customerid,rf.receivedmoney,rf.tollcollector,rf.receiveddate,rf.yearmonth,rf.receivedlatefee,rf.receivedfee,rf.receivedappend,rf.jmman,rf.jmmoney
        from sf_receivedfee rf where rf.electriccompanyid='1000000001' and rf.dealsign=0 and rf.yearmonth in(200811,200901,200903,200804,200805,200806,200807)and rf.customerid=1000052545
       )a
      left outer join
       (select xe.employeeid,xe.name from xt_employee xe
       ) b
     on a.tollcollector=b.employeeid
   ) c
 left outer join
   (select cp.chargeint,cp.customerid from sf_chargeprotocol cp where cp.customerid=1000052545
   ) d
 on c.customerid=d.customerid

-------------------------------------------------------------------------------

参考文章来源:

 http://www.downcodes.com/info/2009/11/27/20091127-11008.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22350698/viewspace-624103/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22350698/viewspace-624103/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值