这种情况下,ORACLE会作如下优化:
where t1.xid=12345
and t1.xid=t2.xid
and t2.xid=12345
and t1.xid=t3.xid
and t3.xid=12345运行是常量优先,所以这么写没有问题的。

解决方案 »

  1.   

    你真给这么多分吗?呵呵,这条语句也就是这么处理了,你可以看看《Oracle Concept》。
      

  2.   

    where t1.xid=12345
    and t2.xid=12345
    and t3.xid=12345
      

  3.   

    zhuzhichao(加强对Oracle的学习)的效率更高
      

  4.   

    我说的是ORACLE的优化机制自动处理的结果,不是人为写出来的,当出现这种情况:
    t1.xid=12345 and t1.xid=t2.xid
    ORACLE会自动优化:
    t1.xid=12345 and t1.xid=t2.xid and t2.xid=12345
    这个优化原则只对常数有效。
      

  5.   

    在ORACLE执行SQL以前, 会根据优化原则(COST BASE/RULE BASE)自动会建立EXECUTION PLAN.
    通常用的都是COST BASE, 我测试的结果, 这句语句牵涉到几个查询:
    EXPLAIN PLAN
    --NESTED LOOPS
      --TABLE ACCESS(BY ROWID) - t1
        --INDEX(UNIQUE SCAN - t1_pk(UNIQUE)
      --TABLE ACCESS(BY ROWID) - t2
        --INDEX(UNIQUE SCAN - t2_pk(UNIQUE)
      --TABLE ACCESS(BY ROWID) - t3
        --INDEX(UNIQUE SCAN - t3_pk(UNIQUE)换了几种写法,得到的EXPLAIN PLAN完全一样. 所以我认为怎么写都是一样的. 其实逻辑最清晰的就是最早的一种写法.-- and t2.xid=t3.xid  -- 1.这一句有用吗?  没有用,反而降低效率
    -- and t2.xid=12345  -- 2.这两句有用吗?   也不必要.
      

  6.   

    在ORACLE执行SQL以前, 会根据优化原则(COST BASE/RULE BASE)自动会建立EXECUTION PLAN.
    通常用的都是COST BASE, 我测试的结果, 这句语句牵涉到几个查询:
    EXPLAIN PLAN
    --NESTED LOOPS
      --TABLE ACCESS(BY ROWID) - t1
        --INDEX(UNIQUE SCAN - t1_pk(UNIQUE)
      --TABLE ACCESS(BY ROWID) - t2
        --INDEX(UNIQUE SCAN - t2_pk(UNIQUE)
      --TABLE ACCESS(BY ROWID) - t3
        --INDEX(UNIQUE SCAN - t3_pk(UNIQUE)换了几种写法,得到的EXPLAIN PLAN完全一样. 所以我认为怎么写都是一样的. 其实逻辑最清晰的就是最早的一种写法.-- and t2.xid=t3.xid  -- 1.这一句有用吗?  没有用,反而降低效率
    -- and t2.xid=12345  -- 2.这两句有用吗?   也不必要.
      

  7.   

    再问:
    如果t1中包含xid的记录有c1条,t2有c2条,t3有c3条,那么查询结果的记录数为c1*c2*c3,对吗?
    我没有系统的学习过SQL,概念不是很清楚,感谢帮助To Kingsunsha:
    Explain plan 是Oracle的工具吗?怎么使用?我只有登录用户权限,可以使用吗?
      

  8.   

    呵呵,COST BASE/RULE BASE 分别怎么发生的?
    看看《Oracle Concept》。
      

  9.   

    TO MountLion(人不寐): EXPLIAN PLAN的方式:
    1、建立EXPLAN表,你必须有建表的权力。运行oracle_home/rdbms/admin/utlxplan.sql
    2、在sql-plus下用下面的命令分析你要执行的sql:
       explain plan
       set statement_id = 'TEST' || user
       for 
          select ...
          from   ...
          where  ...;
    3、根据刚才指定的statement_id察看EXPLAIN_PLAN表,就能看到分析结果。每个版本的explain不一样。
      

  10.   

    请问大家:nicho(妮可)说的有没有道理?请问绿洲:Oracle Concept有没有地方下载?