Откуда вы знаете, что такое хороший индекс? - PullRequest
8 голосов
/ 17 сентября 2008

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

Ответы [ 6 ]

20 голосов
/ 17 сентября 2008

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

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

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

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

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

6 голосов
/ 17 сентября 2008

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

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

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

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

2 голосов
/ 17 сентября 2008

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

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

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

2 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 03 октября 2008

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

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

Например:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

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

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

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

0 голосов
/ 17 сентября 2008

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

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

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