Select Com.Hname, Com.Caseid, sex.sexname, Oci.Isadmin
  From Outchinfo Oci, Compartientbaseinfo Com, OutVisited vis, Sex
 Where Oci.Partientbaseinfoid = Com.Partientbaseinfoid
   And com.sexcode = sex.sexcode(+)
   And Oci.Isadmin In (1, 2)
   And Oci.ReturnVisit >= 0
   And Oci.OutChTime >= Trunc(Sysdate)
   And Oci.OutChTime < Trunc(Sysdate + 1)
   And oci.adminid = vis.adminid
   And vis.staffid = '3484'
 Group by com.Hname, com.caseid, sex.sexname, Oci.Isadmin
 Order by Oci.Isadmin
 我总觉得这样 and一个又一个,还有from表1,表2...这样影响效率
但是不知道是否真如我想像这样。
oracle是怎样优化我们传给他的SQl呢?
请给出比较详细的资料,越详细越好。

解决方案 »

  1.   

      And com.sexcode = sex.sexcode(+) 
    这句可以改为 Left Join sex on sex.sexcode = com.sexcode
    查看执行计划用explain plan for,这个是在sql plus里面执行的,如果用工具pl sql developer或者Toad查看更方便,如果数据库是10G及以上应该都会有自动优化的功能了,另外还要看一些相关的索引是否建立
      

  2.   

    数据库是oracle的,现在程序运行的比较慢。
    我认为是sql语句本身的问提
     And com.sexcode = sex.sexcode(+) 
    这句可以改为 Left Join sex on sex.sexcode = com.sexcode 
    有区别吗是什么呢?
      

  3.   

    可参考如下
    --
    Oracle 建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+).而且(+)是要受下面的规则限制的,但Outer Join语法则不受的~~ 1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中 
    2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段 
    3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件, 
    如果没有 ,oracle不会警告你~只是结果自然不同的 
    4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~ 
    5)不可以用(+)外联接到自己 当然Self Join是可以的 
    6)含(+)的Where后的注意 
    OR不可用 
    IN不可用 
    子查询不可用 现在的Outer Join方法是Oracle9i时开始引用的 ANSI标准的联接语法,现在的则比较直观 简单 
    通过上边Full Join的实现方式 不难看到ANSI的联接语法要比用含Union的(+)的执行效率更高~~