Полное сканирование таблицы при запросе к индексированному столбцу - PullRequest
0 голосов
/ 06 января 2012

Я создал индекс для одной таблицы, простой индекс просто так:

CREATE INDEX IDX_TRANSACAO_NOVA_STATUS ON TRANSACAO_NOVA(STATUS) TABLESPACE COMVENIF;

В этой таблице 1000 регистров insinde и в таблице состояний всего 5 или 6 возможных значений. После создания индекса я ожидал, что приведенный ниже запрос будет иметь лучшую производительность:

select * from transacao_nova tn where tn.status = 'XXX'

но план объяснения покажет мне полное сканирование со стоимостью 16.000.

любая помощь? Я не DBA, но мне нужно улучшить эту производительность.

спасибо заранее.

Ответы [ 4 ]

4 голосов
/ 06 января 2012

Если имеется только 5 или 6 различных значений состояния и миллион записей, оптимизатор запросов может решить, что не стоит использовать индекс для сканирования диапазона, который все равно вернул бы значительное количество всех записей в таблице.

Возможно, вы захотите использовать таблицу кластеризованного индекса для этого приложения.

1 голос
/ 09 января 2012

Если данные в столбце состояния имеют значение перекошено (не однородно: некоторые значения появляются очень часто, а другие появляются очень редко), вы можете ускорить запросы на редкие значения, обновив статистику (и проверив, что вывычисление гистограммы для столбца состояния. Это заставит Oracle использовать индекс в случаях, когда он более эффективен .

http://docs.oracle.com/cd/E11882_01/server.112/e16638/stats.htm#autoId12

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

0 голосов
/ 07 января 2012

Распространенной ошибкой является предположение, что сканирование диапазона индекса будет лучше, чем полное сканирование, потому что вам нужна только небольшая часть от общего числа строк в таблице. Но если нужные вам строки разбросаны по всем экстентам хранения таблицы, их поиск с помощью поиска по индексу может быть медленнее, чем простое сканирование всей таблицы. Я не могу точно сказать, что это так в вашей ситуации, но это возможно.

Для более глубокого обсуждения этой темы я рекомендую этот документ .

0 голосов
/ 06 января 2012

Возможно, вам потребуется сгенерировать новую статистику для таблицы.

http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...