表没有进行索引扫描

时间:2011-10-25 10:09:26

标签: performance oracle

嘿家伙所以有些原因我的桌子正在进行索引快速全扫描。

这是我的查询

SELECT bo.bid,cu.cid 
FROM ass2master_booking bo, ass2master_customer cu 
WHERE bo.cid = cu.cid 
and rownum < 135000; 

这是跟踪文件

SELECT bo.bid,cu.cid 
FROM ass2master_booking bo, ass2master_customer cu 
WHERE bo.cid = cu.cid 
and rownum < 135000


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      2      0.00       0.00          0          0          0           0
Fetch     9001      0.19       0.41        387       2131          0      134999
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     9004      0.19       0.41        387       2131          0      134999

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 5594  

Rows     Row Source Operation
-------  ---------------------------------------------------
134999  COUNT STOPKEY (cr=2131 pr=387 pw=189 time=411804 us)
134999   HASH JOIN  (cr=2131 pr=387 pw=189 time=276737 us)
150000    INDEX FAST FULL SCAN CUSTOMER_CID_IDX (cr=320 pr=315 pw=0 time=263 us)(object   id 332052)
7412    TABLE ACCESS FULL ASS2MASTER_BOOKING (cr=1811 pr=44 pw=0 time=7566 us)

基本上我被告知要在非结构化数据中添加结构我给了2个包含150,000行的表并确定以下哪种结构是最好的。

  • 非聚集索引
  • 聚集索引
  • hash clustered
  • 非结构化数据。

上面给出了我选择进行测试的查询。

1 个答案:

答案 0 :(得分:1)

您正在选择两个表的大部分,因此索引访问没有意义。 (至少oracle认为)

它使用Index Fast Full Scan而不是Table Access Full,因为它在索引中找到了所需的一切(cu.cid),并且不需要该表。

我不知道你的意思

  

非聚集索引聚簇索引散列聚类非结构化数据。

更新:

我认为我使用的经验法则是:

如果您需要超过20%的表格,我希望进行全表扫描。 如果您需要少于5%的表,我希望获得某种索引访问。

调整SQL语句时我要做的第一件事就是查看执行计划并检查oracle希望从每个步骤返回的行数。如果这些数字完全错误,那么执行计划可能非常糟糕。