Подтвердить что ты не робот

Решение о создании индекса в столбце таблицы в базе данных?

Я не парень. Но мне нужно создавать таблицы и делать с ними операции CRUD. Я запутался, если я создаю индекс по всем столбцам по умолчанию или нет? Вот мое понимание, которое я считаю при создании индекса.

Указатель в основном содержит диапазон расположения памяти (начало памяти, где первое значение сохраняется в конце памяти, где последнее значение сохранены). Поэтому, когда мы вставляем какое-либо значение в индекс таблицы для столбца, нужно обновлять, поскольку оно имеет еще одно значение, но обновление столбца значение не повлияет на значение индекса. Правильно?. Итак, нижняя строка - это когда мой столбец используется в соединении между двумя таблицами, которые мы должны рассмотреть создание индекса в столбце, используемом в объединении, но все остальные столбцы можно пропустить, потому что, если мы создадим индекс на них, это потребует дополнительной стоимости обновление значения индекса, когда новое значение вставляется в столбец. Вправо?

Рассмотрим этот сценарий, где таблица mytable содержит два трех столбца: я col1, col2, col3. Теперь мы запускаем этот запрос

select col1,col2 from mytable

Теперь здесь есть два случая. В первом случае мы создаем индекс на col1 и col2. Во втором случае мы не создаем индекс. ** По моему пониманию случай 1 будет быстрее, чем case2, потому что в случае 1 мы, оракул, можем быстро найти местоположение памяти колонок. Итак, здесь я не использовал столбцы соединения, но все же индекс помогает здесь. Так что я должен рассматривать создание индекса здесь или нет? **

Что если в том же сценарии выше, если мы стреляем

select * from mytable

вместо

select col1,col2 from mytable

Здесь будет указана помощь?

4b9b3361

Ответ 1

но обновление значения столбца не повлияет на значение индекса. Правильно?

Нет. Обновление индексированного столбца будет иметь последствия. В руководстве по производительности Oracle 11g

Операторы UPDATE, которые изменяют индексированные столбцы и INSERT и DELETE операторы, которые изменяют индексированные таблицы, занимают больше времени, чем если бы они были нет индекса. Такие операторы SQL должны изменять данные в индексах и данных в столы. Они также создают дополнительный откат и повторение.

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

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

Рассмотрим этот сценарий., Здесь будет указана помощь?

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

Ответ 2

Не создавайте индексы в каждом столбце! Это замедлит выполнение операций вставки/удаления/обновления.

В качестве простого напоминания вы можете создать индекс в столбцах, которые являются общими в предложениях WHERE, ORDER BY и GROUP BY. Вы можете рассмотреть возможность добавления индекса в числах, которые используются для связи других таблиц (например, через JOIN)

Пример:

SELECT col1,col2,col3 FROM my_table WHERE col2=1

Здесь создание индекса в col2 поможет в этом вопросе много.

Также рассмотрим селективность индекса. Проще говоря, создайте индекс для значений, имеющих "большой домен", т.е. Идентификаторы, имена и т.д. Не создавайте их в столбцах "мужчина/женщина".

Ответ 4

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

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

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

Создание индексов с большим количеством столбцов, чем на самом деле используется, помогает только в том случае, если они с большей вероятностью делают покрытие индекса, но добавление всех столбцов будет аналогично индексированной таблице. Обратите внимание, что Oracle не имеет эквивалента SQL Server INCLUDE (COLUMN), который может использоваться для увеличения охвата индексов (он эффективно делает дополнительный кластеризованный индекс только подмножества столбцов) полезен, если вы хотите, чтобы индекс был уникальным, но также добавьте некоторые данные, которые вы не хотите рассматривать в уникальности, но помогаете им покрывать больше запросов)

Вам нужно посмотреть на свои планы, а затем определить, помогут ли индексы. И затем посмотрите на планы, чтобы посмотреть, не изменились ли они.

Ответ 5

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

Кроме того, индексы будут занимать много места на диске и памяти, а также использовать cpu.

Благодаря этому сообщению я узнал об охвате индексов (круто!), но из того, что я понимаю, он позволяет быстро получить другие поля после того, как строка найдена через индекс. Это не значит, что вы указали индексы на все столбцы! просто на pk или поля, на которых вы создаете условия.

Я прав в этой последней точке?

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