2015-11-06 4 views
-4

У меня есть огромная таблица (в Oracle 12c), которая, конечно же, нуждается в индексах. Эта таблица также обновляется очень часто, поэтому, если то, что я узнал, является правильным, то чем меньше индексов, которые у меня есть на этой таблице, тем лучше производительность, когда дело доходит до операций DML в указанной таблице.индексы, индексы, индексы

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

Я собрал этот маленький пример для себя как своего рода руководство по созданию индексов. Это выглядит точным?

CREATE INDEX FOO ON FOO.BAR ("COL1", "COL2", "COL3"); -- COL1 should be the column which is most frequently queried 

SELECT * FROM FOO WHERE COL1 = 'FOO'; -- uses index FOO 

SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR'; -- uses index FOO 

SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR' AND COL3 = 'BAZ' -- uses index FOO 

Таким образом, не было бы никакой необходимости для одного индекса на col1 или на col2 .. если col3 опрашивается себя

(где COL3 = «бла»)

мне понадобилась бы индекс на col3.

если col2 и col3 опрашивались вместе

(где col2 = 'бла' и COL3 = 'blahblah')

тогда я должен был бы индекс на col2, col3 ... но если бы я был запрос, в котором col2 и col3 были использованы вместе, мне не понадобился бы ни один индекс на col. Как все это звучит?

+0

«Огромный стол» - это термин, который означает разные вещи для разных людей. Расскажите, сколько строк, сколько столбцов, ваша ОС, сколько памяти выделено, какие проблемы с производительностью вы заметили, является ли это новой таблицей или существующей таблицей, производственной базой данных или тестом? – kevinsky

+0

У меня есть таблица 200 ГБ с 200 ГБ индексов, которая обновляется ~ 170 раз в секунду ... контекст - это все, и вы должны делать то, что вам нужно. – Ben

+0

стол размером 5 гигабайт и будет расти ... у него есть 24 столбца ... Я понимаю, что вещи обычно свойственны индивидуальной основе, но я просто искал некоторые общие сведения. ОС - SuSE, 4 гигабайта памяти. Испытайте базу данных, чтобы было больше ресурсов, приходящих на производство ... – benjamin

ответ

1

Ваше понимание верности. Комбинированный индекс «нормальный» btree обычно полезен только для ускорения запросов, если вы включаете главный столбец (индексы) индекса в предложение where.

Итак, если у вас есть индекс на c1, c2 и c3, и вы выдаете запрос, который фильтрует только на c2, индекс, вероятно, не полезен. Я говорю, вероятно, потому, что есть сценарии, где Oracle может использовать этот индекс. Один из них - это то, где он может выполнять сканирование (но мне не очень повезло с производительностью при использовании чего-то подобного). Другое дело, если в таблице есть большие строки, которые делают таблицу большой, но столбцы c1, c2 и c3 - это небольшие значения, тогда размер индекса может быть намного меньше размера таблицы, а Oracle может использовать индекс (через быстрое полное сканирование), чтобы ответить на запрос.

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

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