2011-03-15 43 views
1

Oracle數據庫: 我有一個有400000行的表。 我爲field1創建索引。 下面的查詢仍然很慢(700毫秒):Oracle - 索引似乎不起作用。仍然緩慢

select field1, field2 
from table 
where 
field1 = '0903400110106156' or 
field1 = '0903400110106160' or 
field1 = '0903400110106190' or 
field1 = '0903400110106471' or 
field1 = '0903400110106480' or 
field1 = '0903400110106494' or 
field1 = '0903500110100001' or 
field1 = '0903500110100012' or 
field1 = '0903500110100021' or 
field1 = '0903500110100031' or 
field1 = '0903500110100039' or 
field1 = '0903500110100047' or 
field1 = '0903500110100050' 

我刪除索引,我仍然得到700毫秒。 我再次創建索引,我仍然獲得700毫秒。 有什麼問題?

的創建索引的語句:

CREATE INDEX myindex 
ON table (field1) 

編輯:解釋計劃

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------- 
| Id | Operation   | Name   | Rows | Bytes | Cost | 
----------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |    |  4 | 60 |  2 | 
|* 1 | TABLE ACCESS FULL | table   |  4 | 60 |  2 | 
----------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter("table"."field1"='0901690339400674') 

Note: cpu costing is off 

EDIT2:OK,我做了2代表的表分析。 table1有速度問題。儘管其大小與table1相似,但table2速度更快(10msec而不是700msec)。奇怪的速度問題!請幫助...

chk  Owner Name Partition Subpartition Tablespace NumRows Blocks EmptyBlocks AvgSpace ChainCnt AvgRowLen AvgSpaceFLBlocks NumFLBlocks UserStats GlobalStats LastAnalyzed  SampleSize Monitoring Status       PartType  PartInfo  IsExternal 
TRUE user table1        tablespace 484627 6858 182   878   777   103           NO   NO   15/3/2011 18:34 125977  NO   Normal, Successful Completion        FALSE 
TRUE user table2        tablespace 366159 6480 176   786   16565  130           NO   NO   15/3/2011 18:34 89657  NO   Normal, Successful Completion        FALSE 
+0

是什麼解釋說? – 2011-03-15 14:43:26

+0

查詢的執行計劃是什麼樣的。它是否提到你的索引? – 0xCAFEBABE 2011-03-15 14:43:46

回答

0

OK,解決。

昨天我離開工作回家之前,我做了最後一次嘗試,我的查詢仍然很慢(沒有索引使用)。

今天早上我做別的事情之前,我做了另一次嘗試,突然指數工程,我只得到10毫秒。

如果您有任何解釋請發佈。

我加入最後的解釋計劃:

PLAN_TABLE_OUTPUT 

------------------------------------------------------------------------------------ 
| Id | Operation     | Name    | Rows | Bytes | Cost | 
------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT   |      |  1 | 23 |  4 | 
| 1 | TABLE ACCESS BY INDEX ROWID| table    |  1 | 23 |  4 | 
|* 2 | INDEX RANGE SCAN   | myIndex    |  1 |  |  3 | 
------------------------------------------------------------------------------------ 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - access("table"."field1"='0901690339400674') 

Note: cpu costing is off 
+0

對錶或索引的更改要求Oracle數據庫停止並重新啓動才能生效? – 2011-03-16 18:07:10

+0

我確實重新啓動了數據庫,並且也是服務器。但它沒有幫助。離開它半天有幫助,但爲什麼? Oracle有沒有可能需要時間創建索引?如果是這樣,多少時間?半天? (我不這麼認爲) – 2011-03-17 14:26:32

1

嘗試

where 
field1 in ('0903500110100050', '0903500110100050', ..) 
1

不要緊,你是否有FIELD1的索引。數據庫必須先讀取整個表,然後才能滿足WHERE子句中的OR條件(或IN謂詞)。

在循環中,一次將field1的索引和field1的一個field1請求(WHERE field1 =:value)會更快。

+0

我不認爲13個查詢會比1個查詢更快。但是如果沒有執行計劃,很難說清楚。 – 2011-03-15 15:03:41

+0

好的,我在where子句中只嘗試了一個條件,即where field1 ='0903400110106156'。我得到460毫秒!有些事情發生嚴重錯誤 – 2011-03-15 15:07:16

+0

@a_horse_with_no_name:這取決於其他因素,但對索引文件的13次訪問通常比掃描400,000行表的速度快。 – 2011-03-15 15:07:52

1

嘗試在一個索引(字段1,字段2)

 
CREATE INDEX myindex 
ON table (field1, field2) 
+0

嘗試過。沒有幫助。 – 2011-03-15 16:14:26

4

的問題是有點老與此同時但因爲我現在有同樣的問題並沒有答案工作對我來說這裏是在缺少正確的答案我的想法。創建索引後,使用以下語句告訴Oracle有一個新索引,並且只要有可能就必須使用它。

ANALYZE TABLE <tablename> COMPUTE STATISTICS; 

作爲替代方案,你可以告訴Oracle計算只是在你創建一個新的指數瞬間統計:

CREATE INDEX myindex ON table (field1) COMPUTE STATISTICS; 
+0

幫了很多! – 2013-07-01 04:15:14