Каковы различные типы индексов, каковы преимущества каждого из них?
Я слышал о покрывающих и сгруппированных индексах, есть ли еще? Где бы вы их использовали?
Каковы различные типы индексов, каковы преимущества каждого из них?
Я слышал о покрывающих и сгруппированных индексах, есть ли еще? Где бы вы их использовали?
OdeToCode имеет хорошую статью, освещающую основные отличия
Как говорится в статье:
Соответствующие индексы имеют решающее значение для хорошего производительность в больших базах данных. Иногда вы можете наверстать письменный запрос с хорошим индексом, но это может быть трудно компенсировать индексирование даже с лучшими запросами.
Совершенно верно тоже... Если вы только начинаете с этого, я бы сосредоточился на кластерных и составных индексах, так как они, вероятно, будут тем, что вы используете больше всего.
Я добавлю несколько типов индексов
BITMAP - при очень низком числе различных возможных значений, очень быстро и не занимает много места
PARTITIONED - позволяет разбивать индексы на основе некоторого свойства, обычно выгодного на очень больших объектах базы данных для целей хранения или производительности.
Индексы FUNCTION/EXPRESSION - используются для предварительного расчета некоторого значения на основе таблицы и сохранения его в индексе, очень простой пример может быть индексом, основанным на функции lower() или подстроки.
PostgreSQL допускает частичные индексы, где индексируются только строки, соответствующие предикату. Например, вы можете индексировать таблицу клиентов только для активных записей. Это может выглядеть примерно так:
create index i on customers (id, name, whatever) where is_active is true;
Если в вашем индексе много столбцов, и у вас много неактивных клиентов, это может быть большой победой с точки зрения пространства (индекс будет храниться на меньшем количестве дисковых страниц) и, следовательно, производительность. Чтобы попасть в индекс, вам нужно, как минимум, указать предикат:
select name from customers where is_active is true;
Традиционная мудрость предполагает, что выбор индекса должен основываться на мощности. Они скажут:
Для столбца с низкой мощностью, такого как GENDER, используйте растровое изображение. Для высокой мощности, такой как LAST_NAME, используйте b-tree.
Это не относится к Oracle, где выбор индекса должен основываться на типе приложения (OLTP и OLAP). DML в таблицах с растровыми индексами может привести к серьезному конфликту. С другой стороны, Oracle CBO может легко комбинировать несколько растровых индексов вместе, а растровые индексы могут использоваться для поиска нулей. Как правило:
Для OLTP-системы с частыми DML и обычными запросами используйте btree. Для системы OLAP с нечастыми запросами DML и adhoc используйте растровые изображения.
Я не уверен, что это относится к другим базам данных, комментарии приветствуются. Следующие статьи обсуждают тему далее:
Различные системы баз данных имеют разные имена для одного и того же типа индекса, поэтому будьте осторожны с этим. Например, то, что SQL Server и Sybase называют "кластеризованным индексом", вызывают в Oracle "индексированную таблицу".
Я предлагаю вам искать блоги Джейсона Масси (http://statisticsio.com/) и Брент Озар (http://www.brentozar.com/) для соответствующей информации. У них есть сообщение о реальном сценарии, который имеет дело с индексами.
Oracle имеет различные комбинации b-tree, bitmap, секционированного и несегментированного, обратного байта, битмап-соединения и индексов домена.
Здесь ссылка на документацию по 11gR1 по теме: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
SQL Server 2008 имеет отфильтрованные индексы, похожие на PostgreSQL partial индексы. Оба позволяют включать только строки индекса, соответствующие заданным критериям.
Синтаксис идентичен PostgreSQL:
create index i on Customers(name) where is_alive = cast(1 as bit);
Чтобы просмотреть типы индексов и их значения посещений: https://msdn.microsoft.com/en-us/library/ms175049.aspx