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
答案 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