再问: 如果t1中包含xid的记录有c1条,t2有c2条,t3有c3条,那么查询结果的记录数为c1*c2*c3,对吗? 我没有系统的学习过SQL,概念不是很清楚,感谢帮助To Kingsunsha: Explain plan 是Oracle的工具吗?怎么使用?我只有登录用户权限,可以使用吗?
呵呵,COST BASE/RULE BASE 分别怎么发生的? 看看《Oracle Concept》。
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不一样。
and t2.xid=12345
and t3.xid=12345
t1.xid=12345 and t1.xid=t2.xid
ORACLE会自动优化:
t1.xid=12345 and t1.xid=t2.xid and t2.xid=12345
这个优化原则只对常数有效。
通常用的都是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.这两句有用吗? 也不必要.
通常用的都是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.这两句有用吗? 也不必要.
如果t1中包含xid的记录有c1条,t2有c2条,t3有c3条,那么查询结果的记录数为c1*c2*c3,对吗?
我没有系统的学习过SQL,概念不是很清楚,感谢帮助To Kingsunsha:
Explain plan 是Oracle的工具吗?怎么使用?我只有登录用户权限,可以使用吗?
看看《Oracle Concept》。
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不一样。