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呢?
请给出比较详细的资料,越详细越好。
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呢?
请给出比较详细的资料,越详细越好。
这句可以改为 Left Join sex on sex.sexcode = com.sexcode
查看执行计划用explain plan for,这个是在sql plus里面执行的,如果用工具pl sql developer或者Toad查看更方便,如果数据库是10G及以上应该都会有自动优化的功能了,另外还要看一些相关的索引是否建立
我认为是sql语句本身的问提
And com.sexcode = sex.sexcode(+)
这句可以改为 Left Join sex on sex.sexcode = com.sexcode
有区别吗是什么呢?
--
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的(+)的执行效率更高~~