2008-09-17 2 views

ответ

20

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

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

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

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

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

-2

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

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

6

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

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

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

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

2

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

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

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

+0

Не стесняйтесь компилировать информацию об этом и добавлять его в мой связанный пост по индексированию базы данных. – 2008-09-18 04:01:02

0

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

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

Например:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200 

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

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

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

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