2009-12-03 2 views
1

Чтобы оптимизировать запросы SELECT, я запускаю их как с индексом, так и без него и измеряя разницу. Я запускаю кучу разных похожих запросов и пытаюсь выбрать разные данные, чтобы убедиться, что кеширование не отбрасывает результаты. Однако на очень больших таблицах индексы занимают очень много времени для создания, и у меня есть несколько разных представлений о том, какие индексы будут уместны.Отключение индекса в Oracle

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

В качестве альтернативы, есть ли лучший способ оптимизировать запросы на больших таблицах и узнать, какие индексы лучше всего создавать?

+1

Когда вы говорите «запрос», ссылаетесь ли вы на запросы SELECT, или на 'UPDATE' и' INSERT'? Обычно это «INSERT» имеет свою производительность, на которую негативно влияют индексы. «SELECT» обычно улучшает свою производительность. –

+0

Хороший вопрос - я на самом деле говорю об оптимизации запросов SELECT, и я редактирую свой вопрос, чтобы прояснить это. Моя цель - оптимизировать мои запросы SELECT до приемлемого уровня с наименьшим количеством индексов, поскольку больше индексов повреждает мои обновления и удаляет. –

ответ

9

Вы можете установить видимость индекса в 11g -

ALTER INDEX idx1 [ INVISIBLE | VISIBLE ] 

это делает его непригодным для использования оптимизатора, но оракул все еще обновляет индекс, когда данные при добавлении или удалении. Это позволяет легко тестировать производительность с отключенным индексом без необходимости удаления & перестроить весь индекс.

См here для гадательных документации по видимости индекса

3

Вы можете использовать подсказку NO_INDEX в запросах, чтобы игнорировать индексы - см. Документы для более подробной информации. Советник SQL Access Advisor - это утилита Oracle, которая будет рекомендовать стратегии индексирования.

+1

Более точно, SQL Access Advisor является частью пакета Tuning Pack, * платной дополнительной * для лицензии Enterprise Edition. – APC

+1

Кроме того, пакет настройки зависит от диагностического пакета, который также является * платной дополнительной *. Таким образом, SQL Access Advisor - очень дорогой вариант, который не каждый магазин Oracle будет иметь. – APC

+0

@APC - правильно, и полезно отметить – dpbradley

3

Ну вы можете написать запрос таким образом, что он не будет использовать индекс (используя выражение вместо значения)

Например

Select * from foobar where column1 = 'result' --uses index on column1 

Чтобы избежать использования индекса для количества и VARCHAR

Select * from foobar where column1 + 0 = 5 -- simple expression to disable the index 

Select * from foobar where column1 || '' = 'result' --simple expression to disable the index 

Или вы можете просто использовать NVL, чтобы отключить индекс в запросе, не заботясь о типе данных столбца

Select * from foobar where nvl(column1,column1) = 'result' --i love this way :D 

Аналогично можно использовать индекс подсказки

как /* Index(E employee_id) */ использовать индексы. P.S. Это все перефразировано в книге «Книга Дан Бут SQL Tuning». Я начал читать его несколько дней назад.

Смежные вопросы