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

Каковы различные типы индексов, каковы преимущества каждого из них?

Каковы различные типы индексов, каковы преимущества каждого из них?

Я слышал о покрывающих и сгруппированных индексах, есть ли еще? Где бы вы их использовали?

4b9b3361

Ответ 1

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

Ответ 2

OdeToCode имеет хорошую статью, освещающую основные отличия

Как говорится в статье:

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

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

Ответ 3

Я добавлю несколько типов индексов

BITMAP - при очень низком числе различных возможных значений, очень быстро и не занимает много места

PARTITIONED - позволяет разбивать индексы на основе некоторого свойства, обычно выгодного на очень больших объектах базы данных для целей хранения или производительности.

Индексы FUNCTION/EXPRESSION - используются для предварительного расчета некоторого значения на основе таблицы и сохранения его в индексе, очень простой пример может быть индексом, основанным на функции lower() или подстроки.

Ответ 4

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

create index i on customers (id, name, whatever) where is_active is true;

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

select name from customers where is_active is true;

Ответ 5

Традиционная мудрость предполагает, что выбор индекса должен основываться на мощности. Они скажут:

Для столбца с низкой мощностью, такого как GENDER, используйте растровое изображение. Для высокой мощности, такой как LAST_NAME, используйте b-tree.

Это не относится к Oracle, где выбор индекса должен основываться на типе приложения (OLTP и OLAP). DML в таблицах с растровыми индексами может привести к серьезному конфликту. С другой стороны, Oracle CBO может легко комбинировать несколько растровых индексов вместе, а растровые индексы могут использоваться для поиска нулей. Как правило:

Для OLTP-системы с частыми DML и обычными запросами используйте btree. Для системы OLAP с нечастыми запросами DML и adhoc используйте растровые изображения.

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

Ответ 6

Различные системы баз данных имеют разные имена для одного и того же типа индекса, поэтому будьте осторожны с этим. Например, то, что SQL Server и Sybase называют "кластеризованным индексом", вызывают в Oracle "индексированную таблицу".

Ответ 7

Я предлагаю вам искать блоги Джейсона Масси (http://statisticsio.com/) и Брент Озар (http://www.brentozar.com/) для соответствующей информации. У них есть сообщение о реальном сценарии, который имеет дело с индексами.

Ответ 8

Oracle имеет различные комбинации b-tree, bitmap, секционированного и несегментированного, обратного байта, битмап-соединения и индексов домена.

Здесь ссылка на документацию по 11gR1 по теме: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

Ответ 9

  • Уникальный
  • кластер
  • не-кластер
  • хранилище столбцов
  • Индекс с включенным столбцом
  • индекс в вычисленном столбце
  • фильтруется
  • пространственное
  • XML
  • полный текст

Ответ 10

SQL Server 2008 имеет отфильтрованные индексы, похожие на PostgreSQL partial индексы. Оба позволяют включать только строки индекса, соответствующие заданным критериям.

Синтаксис идентичен PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);