Oracle - Index, похоже, не работает.Все еще медленно - PullRequest
1 голос
/ 15 марта 2011

База данных 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 ]

4 голосов
/ 29 ноября 2012

Между тем вопрос немного устарел, но поскольку у меня возникла та же проблема, и у меня не получилось ни одного ответа, это правильный ответ, который, по моему мнению, отсутствует. После создания индекса используйте следующую инструкцию, чтобы сообщить Oracle, что существует новый индекс, и он должен использовать его при любой возможности.

ANALYZE TABLE <tablename> COMPUTE STATISTICS;

В качестве альтернативы вы можете указать Oracle вычислять статистику только в тот момент, когда вы создаете новый индекс:

CREATE INDEX myindex ON table (field1) COMPUTE STATISTICS;
1 голос
/ 15 марта 2011

Неважно, есть ли у вас индекс по полю1.База данных должна прочитать всю таблицу, прежде чем сможет выполнить условие ИЛИ (или предикат IN) в предложении WHERE.

Было бы быстрее разместить индекс для field1 и запросить field2 для одного field1 ввремя (WHERE field1 =: значение) в цикле.

1 голос
/ 15 марта 2011

Попробуйте индексировать по (поле1, поле2)

CREATE INDEX myindex
ON table (field1, field2)
1 голос
/ 15 марта 2011

попробуй

where
field1 in ('0903500110100050', '0903500110100050', .. )
0 голосов
/ 16 марта 2011

ОК, Решено.

Вчера перед уходом с работы я сделал последнюю попытку, и мой запрос все еще был медленным (индекс не использовался).

Сегодня утром, прежде чем что-то делать, я сделал еще одну попытку, и внезапно индекс работает , и я получаю только 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...