Избыточность индексов Oracle - PullRequest
3 голосов
/ 01 октября 2010

Мы с коллегой новички в Oracle и анализируем индексы на столе. Это наследие, и в настоящее время в таблице существуют индексы

Mytable
* ID      (primary key)
* partId  (Id column in part)
* partNum (partNum column in part...partNum can have more than one partId)
* description (description of partNum...can be different for each partNum)
* dateReceived

IDX_PART_ID_PART_NUM(partId, PartNum)
IDX_PART_NUM(partNum)
IDX_DATE_RECEIVED(dateReceived)

Кажется, у нас избыточность в наших индексах. Должны ли мы удалить partNum из IDX_PART_ID_PART_NUM? Должны ли мы удалить IDX_PART_NUM? Как указано выше, partNum может иметь более одного идентификатора, поскольку каждая часть может существовать в объекте более одного раза.

Как правило, в Oracle как работает индекс?

Ответы [ 5 ]

8 голосов
/ 01 октября 2010

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

Вот ссылка на хорошую статью: http://it.toolbox.com/blogs/confessions/post-index-how-oracle-works-10605

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

1 голос
/ 01 октября 2010

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

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

0 голосов
/ 02 октября 2010

В принципе, в Oracle как работает индекс?

Еще один исчерпывающий ответ: http://Use -The-Index-Luke.com

0 голосов
/ 01 октября 2010

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

Запрос по индексу выполняется быстро, если вам требуется менее 20% строк.Запрос для 40% строк, полное сканирование является самым быстрым.Для индекса требуется диск, память, время для вставки / обновления.

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

0 голосов
/ 01 октября 2010

Индекс работает, позволяя базе данных организовывать данные вокруг набора столбцов. Я признаю, что не уверен на 100% в технической реализации этого, но он создает структуру данных, используя значения и сопоставляя их с идентификатором объекта для каждой строки в таблице. (Если я не прав в этом, кто-то поправит меня, хотя это не должно повлиять на ценность моего ответа в целом)

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

Рассмотрим следующее:

SELECT *
FROM MyTable
WHERE partId = 2
  AND partNum = 7

Это будет использовать IDX_PART_ID_PART_NUM для поиска, используя оба значения для сканирования индекса, а не просто IDX_PART_NUM. Это все равно будет быстрее, чем если бы у вас был индекс для обоих столбцов по отдельности.

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

Чтобы ответить на вопрос, если вы часто запрашиваете оба столбца, сохраните составной индекс.

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