Подтвердить что ты не робот

Как выбрать и оптимизировать индексы оракула?

Я хотел бы знать, существуют ли общие правила для создания индекса или нет. Как выбрать, какие поля я должен включать в этот индекс или когда их не включать?

Я знаю, что он всегда зависит от среды и объема данных, но мне было интересно, можем ли мы сделать некоторые общепринятые правила о создании индексов в Oracle.

4b9b3361

Ответ 1

В документации Oracle есть отличный набор соображений для выбора индексирования: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

Цитирование:

  • Рассмотрим ключи индексирования, которые часто используются в предложениях WHERE.

  • Рассмотрим ключи индексирования, которые часто используются для объединения таблиц в операторы SQL. Дополнительные сведения об оптимизации соединений см. В разделе "Использование кластеров Hash для производительности".

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

  • Не используйте стандартные индексы B-дерева для ключей или выражений с несколькими отдельными значениями. Такие клавиши или выражения обычно имеют низкую избирательность и, следовательно, не оптимизируют производительность, если часто выбранные значения клавиш отображаются менее часто, чем другие значения ключа. Вы можете эффективно использовать растровые индексы в таких случаях, если индекс не изменяется часто, как в приложении concurrency OLTP.

  • Не индексируйте столбцы, которые часто изменяются. Операторы UPDATE, которые изменяют индексированные столбцы и инструкции INSERT и DELETE, которые изменяют индексированные таблицы, занимают больше времени, чем если бы не было индекса. Такие операторы SQL должны изменять данные в индексах, а также данные в таблицах. Они также генерируют дополнительные отмены и повторения.

  • Не индексируйте ключи, которые отображаются только в предложениях WHERE с функциями или операторами. Предложение WHERE, которое использует функцию, отличную от MIN или MAX, или оператор с индексированным ключом, не предоставляет доступ к этому пути, который использует индекс, за исключением индексов на основе функций.

  • Рассмотрим индексирование внешних ключей ограничений ссылочной целостности в случаях, когда большое количество одновременных операторов INSERT, UPDATE и DELETE обращаются к родительским и дочерним таблицам. Такой индекс позволяет UPDATE и DELETEs в родительской таблице без совместного доступа к дочерней таблице.

  • Если вы хотите индексировать ключ, подумайте, стоит ли увеличение производительности запросов для потери производительности для INSERT, UPDATE и DELETE и использования пространства, необходимого для хранения индекса. Вы можете поэкспериментировать, сравнивая время обработки SQL-операторов с индексами и без них. Вы можете измерить время обработки с помощью средства отслеживания SQL.

Ответ 2

Есть некоторые вещи, которые вы всегда должны индексировать:

  • Первичные ключи - им присваивается индекс автоматически (если вы не укажете подходящий существующий индекс для использования Oracle)
  • Уникальные ключи - им присваивается индекс автоматически (то же самое)
  • Внешние ключи - эти не автоматически индексируются, но вы должны добавить их, чтобы избежать проблем с производительностью при проверке ограничений.

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

Ответ 3

В Руководстве разработчиков баз данных Oracle 10g - Основы, глава 5:

В общем, вы должны создать индекс в столбце в любой из следующих ситуаций:

  • Часто задается столбец.
  • В столбце существует ограничение ссылочной целостности.
  • В столбце существует единственное ограничение целостности ключа.

Используйте следующие рекомендации для определения того, когда нужно создать индекс:

  • Создайте индекс, если вы часто хотите получить менее 15% строк в большой таблице. Однако этот пороговый процент сильно варьируется в зависимости от относительной скорости сканирования таблицы и того, как кластеризованные данные строки относятся к ключевому индексу. Чем быстрее сканирование таблицы, тем ниже процент; Чем больше кластеризованных данных строки, тем выше процент.
  • Индексные столбцы, которые используются для соединений для повышения эффективности соединения.
  • Первичные и уникальные ключи автоматически имеют индексы, но вам может понадобиться создать индекс для внешнего ключа; см. главу 6 "Обеспечение целостности данных в разработке приложений".
  • Маленькие таблицы не требуют индексов; если запрос занимает слишком много времени, тогда таблица может быть увеличена от малого до большого.

Некоторые столбцы являются сильными кандидатами для индексирования. Столбцы с одной или несколькими из следующих характеристик являются хорошими кандидатами для индексирования:

  • Значения уникальны в столбце или несколько дубликатов.
  • Существует широкий диапазон значений (полезно для регулярных индексов).
  • Существует небольшой диапазон значений (хорош для индексов растровых изображений).
  • В столбце содержится много нулей, но запросы часто выбирают все строки, имеющие значение. В этом случае сравнение, которое соответствует всем ненулевым значениям, например:

    WHERE COL_X >= -9.99 * power (10,125) предпочтительнее WHERE COL_X NOT NULL

    Это связано с тем, что первый использует индекс на COL_X (при условии, что COL_X является числовым столбцом).

Столбцы со следующими характеристиками менее подходят для индексирования:

  • В столбце много нулей, и вы не выполняете поиск по ненулевым значениям.

Ответ 4

Ничего себе, это просто такая огромная тема, трудно ответить в этом формате. Я настоятельно рекомендую эту книгу.

Структура индекса реляционных баз данных и оптимизаторы Тапио Лахденмаки

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

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

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

Посмотрите, насколько конкретными могут быть эти оптимизации?

Ответ 5

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

-Adam

Ответ 6

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

Взгляните на SQL - на что указывают предложения where. Им может понадобиться индекс.

Measure. В чем проблема - страницы/запросы слишком длинные? что используется для запросов. Создайте индекс для этих столбцов.

Предостережения: индексы нуждаются во времени для обновлений и пространства.

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