Отключение индекса в Oracle - PullRequest
1 голос
/ 03 декабря 2009

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

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

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

Ответы [ 3 ]

9 голосов
/ 03 декабря 2009

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

ALTER INDEX idx1 [ INVISIBLE | VISIBLE ]

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

См. здесь для документов оракула по видимости индекса

3 голосов
/ 06 декабря 2009

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

Например

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) */ для использования индексов. Постскриптум Это все перефразировано из книги SQL Tuning Дэна Тау. Я начал читать это несколько дней назад:)

3 голосов
/ 03 декабря 2009

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

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