一条sql语句

ruide205 2005-12-12 05:01:41
不好意思,问题急待解决,我把问题具体化,达人们给看下:
insert into table (
select * from t1,t2 where t1.fid = t2.fid
union
select * from t1@lk1 t1,t2@lk1 t2 where t1.fid = t2.fid
union
select * from t1@lk2 t1,t2@lk2 t2 where t1.fid = t2.fid
);
第一条select语句10000条记录
第一条select语句5000条记录
第一条select语句1000条记录
t1为用户表,t2为订单表 t2数据远大于t1
问题:
三条select的顺序有关吗?
t1 t2的顺序有关吗?
如果一个字段只有0 1 2 三个值 <>0和 in (1,2)有区别吗?
默认的优化器是基于选择,怎么先analyse,然后使用基于成本来提高效率?
请大虾举例说明~~:)
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
软侠 2005-12-14
  • 打赏
  • 举报
回复
不可能是解釋一個操作需花的時間,這是沒有意義的,比如說,解釋JOIN操作大概需要多少時間,這有何意義?所以它隻能是完成某個操作時所花費的時間!樓主可以使用一個比較復雜的語句執行一次查詢,然後再看看它的執行計劃的記錄,你就能明白了!
ruide205 2005-12-14
  • 打赏
  • 举报
回复
这个显示的时间应该是explain plan的时间吧?不是执行查讯的时间!
还有结果中只是具体到表,没有where 后的条件,也没有索引~~
ruide205 2005-12-13
  • 打赏
  • 举报
回复
问题主要是想提高效率,象这种情况表名的顺序 where子句的顺序?
选择优化器?
小弟在developer中执行explain plan,结果看不是很明白 哪位能介绍下 explain plan中的结果都怎么看?
超叔csdn 2005-12-13
  • 打赏
  • 举报
回复
这里的*不用指明,它会把T1.*和T2.*都显示出来.
但如果你在*的后面加个,再加个ROWNUM这样的情况就要在*前指明了.
软侠 2005-12-13
  • 打赏
  • 举报
回复
有沒有看到OPERATION一欄?你按此欄的值往下看下去,就知道服務器執行你的查詢的過程了(比如SORT是對記錄集進行排序操作,UNION_ALL是進行記錄集的聯合操作等等),至於每個OPERATION的結束時間(也可能是開始時間,我不大清楚),左邊第一欄已顯示得很清楚,不過沒有顯示到毫秒。
ruide205 2005-12-13
  • 打赏
  • 举报
回复
想请问下如何可以看出
SQL语句执行的时间.连接顺序 及索引的应用情况
ruide205 2005-12-13
  • 打赏
  • 举报
回复
执行此过程的据库是9i,不过link的有8i的数据库
这个是小弟的执行计划,我把plan_table中的数据拿出来,不过看不是很懂:
TIMESTAMP OPERATION OPTIONS OBJECT_NODE OBJECT_OWNER OBJECT_NAME OBJECT_INSTANCE ID PARENT_ID POSITION
2005-12-13 16:34:09 SELECT STATEMENT 0
2005-12-13 16:34:09 VIEW SOCCER 1 1 0 1
2005-12-13 16:34:09 SORT UNIQUE 2 1 1
2005-12-13 16:34:09 UNION-ALL 3 2 1
2005-12-13 16:34:09 MERGE JOIN 4 3 1
2005-12-13 16:34:09 SORT JOIN 5 4 1
2005-12-13 16:34:09 TABLE ACCESS FULL WEB T_WEBUSERINFO 3 6 5 1
2005-12-13 16:34:09 SORT JOIN 7 4 2
2005-12-13 16:34:09 TABLE ACCESS FULL WEB T_ORDER 2 8 7 1
2005-12-13 16:34:09 MERGE JOIN 9 3 2
2005-12-13 16:34:09 SORT JOIN 10 9 1
2005-12-13 16:34:09 TABLE ACCESS FULL YP188 T_WEBUSERINFO 5 11 10 1
2005-12-13 16:34:09 SORT JOIN 12 9 2
2005-12-13 16:34:09 TABLE ACCESS FULL YP188 T_ORDER 4 13 12 1
2005-12-13 16:34:09 REMOTE LK46.US.ORACLE.COM 14 3 3
2005-12-13 16:34:09 MERGE JOIN 15 3 4
2005-12-13 16:34:09 SORT JOIN 16 15 1
2005-12-13 16:34:09 REMOTE LK46.US.ORACLE.COM 17 16 1
2005-12-13 16:34:09 SORT JOIN 18 15 2
2005-12-13 16:34:09 REMOTE LK46.US.ORACLE.COM 19 18 1
软侠 2005-12-13
  • 打赏
  • 举报
回复
不知道樓主的Oracle的牘本是什麼!

我對你的三個問題的觀點分別是:
一、三条select的顺序有关吗?无关
二、t1 t2的顺序有关吗? 有很大關系,如果你的版本是高版本的Oracle(9i及以上),建議晝量使用JOIN運算符,而不要將連接條件寫在Where子句中,並且一定要注意先把數據量小的表放在前,這樣就不會產生一個很大的“內存表”!另外還要注意兩表的索引列的順序!
三、如果一个字段只有0 1 2 三个值 <>0和 in (1,2)有区别吗?肯定有區別,因為對於同一行數據來說,<>0比較一次就可以了,但in (1,2)可能要比較兩次!
xjqqxjqq 2005-12-13
  • 打赏
  • 举报
回复
http://matrix.org.cn/thread.shtml;jsessionid=5CC981759F0BCBD0AD71962E0EFC2403?topicId=22465&forumId=36
看看这个链接吧,可能对你有帮助。
lovezhu 2005-12-12
  • 打赏
  • 举报
回复
select * from t1,t2 where t1.fid = t2.fid 这个有问题
*得指明是t1,还是t2
另外 “t2数据远大于t1 ”
好象应该这样写:where t2.fid = t1.fid
tangtangno1 2005-12-12
  • 打赏
  • 举报
回复
问题:
三条select的顺序有关吗?无关
t1 t2的顺序有关吗? 有关.具体是前者作为主循环还是后者记不清楚了,但你可以采用外连接的方法,按照你的t2数据远大于t1应该这么写:t1.fid=t2.fid(+)
如果一个字段只有0 1 2 三个值 <>0和 in (1,2)有区别吗?有区别。如果你是多cpu那么in (1,2)可能会产生两个线程自然就快,否则还是<>0的好
默认的优化器是基于选择,怎么先analyse,然后使用基于成本来提高效率?偶不会基于成本。偶总是看一下sql的执行策略是用什么索引然后修改sql的写法
liuyi8903 2005-12-12
  • 打赏
  • 举报
回复
顺序无所谓.另外如果你1,2返回的值过多的话也不会走索引.
如果相当少的话,你可以考虑使用firstrows来提示优化器
1,2你可以使用or操作符来替代.对比执行计划来作调整.

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧