Введение
В базах данных частичный индекс, также известный как фильтрованный индекс, – это индекс, к которому применено определенное условие, в результате чего он включает подмножество строк таблицы. Это позволяет индексу оставаться небольшим, даже если таблица достаточно велика и обладает высокой селективностью. Например, представьте таблицу транзакций, где записи изначально имеют статус = 'A' (активные), а затем могут переходить в другие статусы ('P' – в ожидании, 'W' – в работе) перед достижением финального статуса 'F', после которого повторная обработка маловероятна. В PostgreSQL полезный частичный индекс можно определить следующим образом:
create index partial_status on txn_table (status)
where status in ('A', 'P', 'W');
Этот индекс не будет хранить миллионы строк, достигших финального статуса 'F', и позволит эффективно искать транзакции, которые еще "требуют обработки", используя этот индекс. Аналогично, частичный индекс можно использовать для индексации только тех строк, где столбец не равен NULL, что будет полезно, если столбец обычно содержит NULL-значения. create index partial_object_update on object_table (updated_on)
where updated_on is not null;
Этот индекс позволит следующему запросу читать только обновленные записи:
select * from object_table
where updated_on is not null
order by updated_on;
Условие не обязательно должно совпадать с критерием индекса; в статье Стоунбрейкера, представленной ниже, приведены примеры индексов, подобных следующим:
create index partial_salary on employee(age)
where salary > 2100;
create index partial status on txn table (status)
where status in ('A', 'P', 'W');
This index would not bother storing any of the millions of rows that have reached "final" status, 'F', and would allow queries looking for transactions that still "need work" to efficiently search via this index. Similarly, a partial index can be used to index only those rows where a column is not null, which will be of benefit when the column usually is null. create index partial object update on object table (updated on)
where updated on is not null;
This index would allow the following query to read only the updated tuples:
select * from object table
where updated on is not null
order by updated on;
It is not necessary that the condition be the same as the index criterion; Stonebraker's paper below presents a number of examples with indexes similar to the following:
create index partial salary on employee(age)
where salary > 2100;
Поддержка
В SQL Server этот тип индекса называется фильтрованным индексом. Частичные индексы поддерживаются в PostgreSQL начиная с версии 7.2, выпущенной в феврале 2002 года. SQLite поддерживает частичные индексы с версии 3.8.0. MongoDB поддерживает частичные индексы с версии 3.2.