Откуда ты знаешь, что такое хороший индекс?

Когда вы работаете с таблицами в Oracle, как вы узнаете, когда настраиваете хороший индекс вместо плохого индекса?

6 ответов

Решение

Это зависит от того, что вы подразумеваете под "хорошим" и "плохим". По сути, вы должны понимать, что каждый добавленный вами индекс будет увеличивать производительность при любом поиске по этому столбцу (поэтому добавление индекса в столбец 'lastname' таблицы person увеличит производительность по запросам, в которых есть "where lastname = "), но уменьшить производительность записи по всей таблице.

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

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

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

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

Поля, которые разнообразны, очень специфичны или уникальны, являются хорошими показателями. Такие как даты и метки времени, уникальные инкрементные номера (обычно используемые в качестве первичных ключей), имена людей, номера автомобильных номеров и т. Д.

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

Описательные строки произвольной формы полной длины создают плохие индексы, поскольку тот, кто выполняет запрос, редко знает точное значение строки.

Линейно упорядоченные данные (такие как отметки времени или даты) обычно используются в качестве кластеризованного индекса, что заставляет строки храниться в порядке индекса и обеспечивает доступ по порядку, что значительно ускоряет запросы диапазона (например, "дайте мне все заказы на продажу" между октябрем и декабрем). В таком случае механизм БД может просто искать первую запись, заданную диапазоном, и начать чтение последовательно, пока не достигнет последней.

@Infamous Cow - вы должны думать о первичных ключах, а не об индексах.

@Xenph Yan - То, что другие не затронули, - это выбор индекса для создания. Некоторые базы данных на самом деле не дают вам большого выбора, но некоторые имеют большое разнообразие возможных индексов. B-деревья по умолчанию, но не всегда лучший вид индекса. Выбор правильной структуры зависит от того, какое использование вы ожидаете. Какие типы запросов вам нужно поддерживать больше всего? Вы в основном для чтения или для записи? В ваших записях преобладают обновления или добавления? И т. Д.

Описание различных типов индексов и их плюсов и минусов доступно здесь: https://web.archive.org/web/20080701193711/http://20bits.com/2008/05/13/interview-questions-database-indexes/.

Вот отличная статья о SQL Server: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

Хотя механика не будет работать в Oracle, советы очень кстати (за исключением кластерных индексов, которые не совсем работают в Oracle).

Некоторые практические правила, если вы пытаетесь улучшить конкретный запрос.

Для конкретной таблицы (с которой, по вашему мнению, должен начинаться Oracle) попробуйте проиндексировать каждый из столбцов, используемых в предложении WHERE. Сначала ставьте столбцы с равенством, а затем столбцы с диапазоном или чем-то подобным.

Например:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

Если столбцы очень велики по размеру (например, вы храните какой-то XML или что-то еще), вам лучше не указывать их в индексе. Это уменьшит индекс для сканирования, при условии, что вам придется перейти к строке таблицы, чтобы в любом случае удовлетворить список выбора.

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

Вы можете написать книгу о лучших способах индексации - ищите автора Джонатана Льюиса.

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

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

Другие вопросы по тегам