Каковы различные типы индексов, каковы преимущества каждого из них?
Каковы различные типы индексов, каковы преимущества каждого из них?
Я слышал о покрывающих и сгруппированных индексах, есть ли еще? Где бы вы их использовали?
Ответы
Ответ 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);
Ответ 11
Чтобы просмотреть типы индексов и их значения посещений:
https://msdn.microsoft.com/en-us/library/ms175049.aspx