Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Например:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top