甲骨文 - 索引似乎不起作用。仍然很慢

时间:2011-03-15 14:40:24

标签: database performance indexing

Oracle数据库: 我有一个400000行的表。 我为field1创建了一个索引。 以下查询仍然很慢(700毫秒):

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:好的,我对2张桌子进行了表格分析。 table1有速度问题。 table2的速度要快得多(10毫秒而不是700毫秒),尽管它的大小与table1类似。奇怪的速度问题!请帮忙......

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

5 个答案:

答案 0 :(得分:4)

问题有点老了,但由于我现在遇到了同样的问题而且没有答案对我有用,这是我认为缺少的正确答案。创建索引后,使用以下语句告诉Oracle有一个新索引,并且必须尽可能使用它。

ANALYZE TABLE <tablename> COMPUTE STATISTICS;

作为替代方案,您可以告诉Oracle在您创建新索引的那一刻计算统计信息:

CREATE INDEX myindex ON table (field1) COMPUTE STATISTICS;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你是否在field1上有索引并不重要。数据库必须先读取整个表,然后才能满足WHERE子句的OR条件(或IN谓词)。

在一个循环中,一次将一个索引放在field1上并为一个field1请求field2(WHERE field1 =:value)会更快。

答案 3 :(得分:1)

在(field1,field2)上尝试索引

CREATE INDEX myindex
ON table (field1, field2)

答案 4 :(得分:0)

好的,解决了。

昨天我离开工作回家之前我做了最后一次尝试,我的查询仍然很慢(没有使用索引)。

今天早上在我做任何其他事情之前,我又做了一次尝试,突然间索引工作,我只有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