Решение, когда создать индекс по столбцу таблицы в базе данных? - PullRequest
30 голосов
/ 12 октября 2011

Я не парень ДБ.Но мне нужно создавать таблицы и выполнять над ними операции CRUD.Я запутался, должен ли я создать индекс по всем столбцам по умолчанию или нет?Вот мое понимание, которое я учитываю при создании индекса.

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

Рассмотрим этот сценарий, в котором таблица mytable содержит два трех столбца, например col1, col2, col3.Теперь мы запускаем этот запрос

select col1,col2 from mytable

Теперь здесь есть два случая.В первом случае мы создаем индекс по col1 и col2.Во втором случае мы не создаем никакого индекса. ** Согласно моему пониманию, случай 1 будет быстрее, чем случай 2, потому что в случае 1 мы, оракул, можем быстро найти ячейку памяти столбца.Так что здесь я не использовал ни одного столбца соединения, но индекс здесь помогает.Так я должен рассмотреть создание индекса здесь или нет? **

Что если в том же сценарии выше, если мы запускаем

select * from mytable

вместо

select col1,col2 from mytable

Поможет ли здесь индекс?

Ответы [ 3 ]

30 голосов
/ 12 октября 2011

Не создавайте индексы в каждом столбце!Это замедлит работу операций вставки / удаления / обновления.

В качестве простого напоминания вы можете создать индекс в столбцах, которые являются общими в предложениях WHERE, ORDER BY и GROUP BY.Вы можете рассмотреть возможность добавления индекса в столбцы, которые используются для связи с другими таблицами (например, через JOIN)

Пример:

SELECT col1,col2,col3 FROM my_table WHERE col2=1

Здесь создание индекса на col2 будеточень помогите в этом запросе.

Также рассмотрите избирательность индекса.Проще говоря, создайте индекс для значений, которые имеют «большой домен», т. Е. Идентификаторы, имена и т. Д. Не создавайте их для столбцов «Мужской / Женский».

14 голосов
/ 12 октября 2011

, но обновление значения столбца не повлияет на значение индекса. Правильно?

Нет. Обновление индексированного столбца окажет влияние. Руководство по производительности Oracle 11g гласит:

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


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

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

Рассмотрим этот сценарий. , , Индекс поможет здесь?

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

3 голосов
/ 13 октября 2011

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

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

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

Создание индексов с большим количеством столбцовчем фактически используются, помогает только в том случае, если они с большей вероятностью будут покрывать индекс, но добавление всех столбцов будет похоже на таблицу, организованную по индексу.Обратите внимание, что Oracle не имеет эквивалента INCLUDE (COLUMN) в SQL Server, который можно использовать для более полного охвата индексов (это делает дополнительный кластеризованный индекс только подмножеством столбцов - полезно, если вы хотите, чтобы индекс был уникальным, нотакже добавьте некоторые данные, которые вы не хотите рассматривать в уникальности, но которые помогают охватить больше запросов)

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

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