2010-10-01 4 views
3

Мы с коллегой новы в Oracle и анализируем индексы на таблице. Это наследие, и в настоящее время его нет в спискеОпорная избыточность 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, как работает индекс?

ответ

8

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

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

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

0

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

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

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

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

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

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

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

1

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

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

0

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

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

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

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

  • Нет связанных вопросов^_^