2011-10-25 67 views
0

嘿家伙所以有些原因我的表正在做索引快速全面扫描。表没有做索引扫描

这里是我的查询

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) 

基本上我被告知要添加结构unstructred数据我得到2台15万行和determ的其中以下结构是最好的。

  • 非聚集索引
  • 聚集索引
  • 散列群集
  • 非结构化数据。

而我选择用来做测试的查询如上。

回答

1

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

它使用索引快速全面扫描,而不是表访问完整,因为它找到索引中所需的一切(cu.cid),并不需要该表。

我不知道你的意思与

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

更新:

我觉得一个经验法则我使用:

如果你需要一个表的更多的则20%我期待有一个全表扫描。 如果你需要少于5%的表,我希望有某种索引访问。

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

+0

嗨jens,何时应该使用索引?当你在特定的表中选择特定的值时?比如customername ='tom'? – paktrick