执行计划的问题

[复制链接]
查看11 | 回复9 | 2006-4-17 13:46:34 | 显示全部楼层 |阅读模式
SQL> Select /*+ index(a,wip_info_fwseq) */
2 Wafer_no, Wait_time, In_time, Out_time, Sysdate, Status, Proc_id
3from Wip_info a
4 where Proc_Flow = 'P06C14'
5 order by Wafer_no, Proc_Seq_hist;
已选择341637行。
已用时间:00: 00: 50.06
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=33710 Card=39172 Byt

es=1606052)
10 TABLE ACCESS (BY INDEX ROWID) OF 'WIP_INFO' (Cost=33710 Ca

rd=39172 Bytes=1606052)
21 INDEX (RANGE SCAN) OF 'WIP_INFO_FWSEQ' (NON-UNIQUE) (Cos

t=256 Card=39172)


Statistics
----------------------------------------------------------

0recursive calls

0db block gets
300146consistent gets
14352physical reads

0redo size
14457205bytes sent via SQL*Net to client
251028bytes received via SQL*Net from client
22777SQL*Net roundtrips to/from client

0sorts (memory)

0sorts (disk)
341637rows processed
SQL> SelectWafer_no, Wait_time, In_time, Out_time, Sysdate, Status, Proc_id
2from Wip_info a
3 where Proc_Flow = 'P06C14'
4 order by Wafer_no, Proc_Seq_hist;
已选择341637行。
已用时间:00: 00: 38.01
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=9097 Card=39172 Byte

s=1606052)
10 SORT (ORDER BY) (Cost=9097 Card=39172 Bytes=1606052)
21 TABLE ACCESS (FULL) OF 'WIP_INFO' (Cost=8808 Card=39172

Bytes=1606052)


Statistics
----------------------------------------------------------

0recursive calls
10db block gets
92864consistent gets
68347physical reads

0redo size
14457205bytes sent via SQL*Net to client
251028bytes received via SQL*Net from client
22777SQL*Net roundtrips to/from client

0sorts (memory)

1sorts (disk)
341637rows processed
SQL>
谁能帮我解释一下。当我不加提示执行SQL。为什么Oracle选全表
扫描。明明物理读很多。SQL执行是physical reads重要还是consistent gets重要。
  虽然从整个执行时间还看。第二个执行总时间上要比第一个快。但是在PL/SQL等一些表格工具查询时。第一个SQL的响应速度只要0.1秒。数据库的optimizer_mode是choose
在不改成FIRST_ROWS,不改动SQL的情况下。怎么让Oracle选择索引。
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
是不是要analyzetable 一下 ?
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
这个表我两个星期会分析一次
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
会不会oracle缺省就是认为all_rows, 因为查询所有记录,的确全表扫描要快些啊。
另请问 'WIP_INFO_FWSEQ' 这个索引是建立在哪些列上的啊?
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
ding
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
oracle生成执行计划的时候时候不知道physical reads有多大,因为这涉及到当前的databuffer内容
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
很显然,通过索引查找要的花费更大,所以CBO选择full table扫描,OK?
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
对。在实际执行的时候。全表扫的花费是小。但是从资料的回应时间看。用萦引的更快(如果只返回前50笔,只要0.1秒)
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
請把Proc_Flow = 'P06C14'的數據量和縂數據量比較下看看
還有就是disctinct row的數量
索引了哪些列這些都列出來大概就清楚了
回复

使用道具 举报

千问 | 2006-4-17 13:46:34 | 显示全部楼层
从楼主的描述来说,令人很是费解
1。你必须承认,Oracle 根据现有的资料 做出了十分正确的选择
正如你所描述的,第二个SQL 执行总时间上要比第一个快,所以Oracle 选择第二个执行计划是很正确的
2。你既然想让Oracle 改变策略,想让SQL 执行时,选择前几行返回快的执行计划,那么,就应该设置first_row. 但是,你却把这个Option给排除了……
为什么要排除设置first_row?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行