При работе с таблицами в Oracle, как вы знаете, когда вы создаете хороший индекс против плохого индекса?
Откуда вы знаете, какой хороший индекс?
Ответ 1
Это зависит от того, что вы подразумеваете под "хорошим" и "плохим". В основном вам нужно понять, что каждый добавленный вами индекс повысит производительность при любом поиске по этому столбцу (поэтому добавление индекса в столбец "lastname" таблицы лиц увеличивает производительность при запросах с "где lastname =" в них), но уменьшите производительность записи по всей таблице.
Причиной этого является добавление или обновление строки, она должна добавлять или обновлять как сама таблица, так и каждый индекс, в который входит эта строка. Поэтому, если у вас пять указателей на таблице, каждое добавление должно записываться в шесть мест - пять индексов и таблицу - и обновление может касаться до шести мест в худшем случае.
Создание индекса является балансирующим действием, а затем между скоростью запроса и скоростью записи. В некоторых случаях, таких как датамарт, который загружается только один раз в неделю на ночной задаче, но запрашивается тысячи раз в день, имеет смысл перегрузить индексы и максимально ускорить запросы. В случае систем обработки транзакций онлайн вы хотите попытаться найти баланс между ними.
Итак, добавьте индексы в столбцы, которые много используются в выбранных запросах, но старайтесь избегать добавления слишком большого количества и поэтому сначала добавлять наиболее используемые столбцы.
После этого это вопрос нагрузочного тестирования, чтобы увидеть, как производительность реагирует в условиях производства, и много настроек, чтобы найти приемлемый баланс.
Ответ 2
Поля, которые являются разнообразными, высокоспецифичными или уникальными, делают хорошие индексы. Такие, как даты и временные метки, уникальные инкрементные числа (обычно используемые в качестве первичных ключей), имена людей, номера номерных знаков и т.д.
Контрпример будет равен полу - есть только два общих значения, поэтому индекс действительно не помогает уменьшить количество строк, которые необходимо отсканировать.
Полноразмерные дескриптивные строки свободной формы делают слабые индексы, так как тот, кто выполняет запрос, редко знает точное значение строки.
Линейно упорядоченные данные (такие как временные метки или даты) обычно используются как кластеризованный индекс, который заставляет строки сохраняться в порядке индекса и позволяет осуществлять доступ по заказу, значительно ускоряя запросы диапазона (например, "дайте мне все заказы на продажу в период с октября по декабрь). В таком случае механизм БД может просто искать первую запись, указанную диапазоном, и начинать считывать последовательно, пока не достигнет последней.
Ответ 3
Здесь отличная статья SQL Server: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx
Хотя механика не будет работать на Oracle, подсказки очень приветствуются (минус вещь в кластерных индексах, которые не совсем одинаково работают в Oracle).
Ответ 4
@Infamous Cow - вы должны думать о первичных ключах, а не о индексах.
@Xenph Yan - То, что другие не затронули, - это выбор типа индекса для создания. Некоторые базы данных не дают вам большого выбора, но некоторые из них имеют большое количество возможных индексов. B-деревья по умолчанию, но не всегда лучший тип индекса. Выбор правильной структуры зависит от вида использования, которое вы ожидаете. Какие запросы вам нужны для поддержки большинства? Вы находитесь в среде с чтением или большей частью записи? Являются ли ваши записи доминирующими в обновлениях или добавлениях? Etc и т.д.
Описание различных типов индексов и их плюсов и минусов доступно здесь: http://20bits.com/2008/05/13/interview-questions-database-indexes/.
Ответ 5
Некоторые правила большого пальца, если вы пытаетесь улучшить конкретный запрос.
Для конкретной таблицы (где, по вашему мнению, следует начать Oracle) попробуйте индексировать каждый из столбцов, используемых в предложении WHERE. Сначала поместите столбцы с равенством, а затем столбцы с диапазоном или как.
Например:
WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200
Если столбцы очень большие по размеру (например, вы храните некоторый XML или что-то еще), вам может быть лучше оставить их вне индекса. Это сделает индекс меньше для сканирования, предполагая, что вам нужно идти в строку таблицы, чтобы в любом случае удовлетворить список выбора.
В качестве альтернативы, если все значения в предложениях SELECT и WHERE в индексе Oracle не нуждаются в доступе к строке таблицы. Поэтому иногда рекомендуется помещать выбранные значения в индекс и избегать доступа к таблице.
Вы можете написать книгу о лучших способах индексирования - искать автора Джонатана Льюиса.
Ответ 6
Хороший индекс - это то, на что вы можете положиться, чтобы быть уникальным для конкретной строки таблицы.
Одна широко используемая индексная схема - это использование чисел, которые увеличиваются на 1 для каждой строки в таблице. Каждая строка будет иметь другой индекс числа.