Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

CREATE INDEX

Определяет новый индекс.

Синтаксис

CREATE [UNIQUE] INDEX [<name>] ON <table_name> [USING <method>]
       ( {<column_name> | (<expression>)} [COLLATE <collation>] [<opclass>] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
       [ WITH ( <storage_parameter> = <value> [, ... ] ) ]
       [ TABLESPACE <tablespace_name> ]
       [ WHERE <predicate> ]

Описание

Команда CREATE INDEX создает индекс для указанного столбца (или столбцов) указанной таблицы или материализованного представления. Индексы используются в основном для повышения производительности базы данных (при этом их ненадлежащее использование может наоборот привести к снижению производительности).

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

Поле индекса может быть выражением, вычисляемым на основе значений одного или нескольких столбцов строки таблицы. Этот механизм можно использовать для получения быстрого доступа к данным на основе некоторого преобразования базовых данных. Например, индекс, вычисленный для upper(col), позволит использовать индекс в выражении WHERE upper(col) = 'JIM'.

Greengage DB предоставляет методы индексирования B-tree, bitmap, GiST, SP-GiST и GIN. Пользователи также могут определять свои собственные методы индексирования, но это довольно сложно.

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

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

Все функции и операторы, используемые в определении индекса, должны быть неизменяемыми (immutable). Их результат должен зависеть исключительно от аргументов, а не от внешних факторов (например, содержимого другой таблицы или значений параметров). Это ограничение гарантирует, что поведение индекса четко определено. Чтобы использовать пользовательскую функцию в выражении индекса или выражении WHERE, необходимо при ее создании пометить функцию как IMMUTABLE.

Параметры

Параметр Описание

UNIQUE

Проверяет наличие дублирующихся значений в таблице при создании индекса и при каждом добавлении данных. Дублирующиеся записи вызовут ошибку. Уникальные индексы применяются только к индексам B-tree. В Greengage DB уникальные индексы разрешены только в том случае, если столбцы ключа индекса совпадают с ключом распределения (или являются его надмножеством). В партиционированных таблицах уникальный индекс поддерживается только в пределах отдельной партиции, но не между всеми партициями

name

Имя создаваемого индекса. Индекс всегда создается в той же схеме, что и его родительская таблица. Если имя не указано, Greengage DB выбирает подходящее имя на основе имени родительской таблицы и имен индексируемых столбцов

table_name

Имя (опционально указанное со схемой) индексируемой таблицы

method

Имя используемого метода индексирования. Доступные варианты: btree, bitmap, gist, spgist и gin. По умолчанию используется метод btree.

В настоящее время только методы индексирования B-tree, bitmap, GiST и GIN поддерживают многостолбцовые индексы. По умолчанию можно указать до 32 полей. Только B-tree в настоящее время поддерживает уникальные индексы.

GPORCA поддерживает только индексы B-tree, bitmap, GiST и GIN. GPORCA игнорирует индексы, созданные с использованием неподдерживаемых методов индексирования

column_name

Имя столбца таблицы, для которого создается индекс

expression

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

collation

Имя правила сортировки (collation), используемого для индекса. По умолчанию индекс использует правило сортировки, объявленное для индексируемого столбца, или правило сортировки результата индексируемого выражения. Индексы с недефолтными правилами сортировки могут быть полезны для запросов, включающих выражения с такими правилами

opclass

Имя класса операторов. Класс операторов определяет операторы, которые будут использоваться индексом для этого столбца. Например, индекс B-tree для четырехбайтовых целых чисел будет использовать класс int4_ops (этот класс операторов включает функции сравнения для четырехбайтовых целых чисел). На практике класса операторов по умолчанию для типа данных столбца обычно достаточно. Основной смысл наличия классов операторов заключается в том, что для некоторых типов данных может существовать более одного осмысленного порядка сортировки. Например, тип данных комплексных чисел можно сортировать либо по абсолютному значению, либо по действительной части. Можно реализовать это, определив два класса операторов для этого типа данных и затем выбрав соответствующий класс при создании индекса

ASC

Задает порядок сортировки по возрастанию (используется по умолчанию)

DESC

Задает порядок сортировки по убыванию

NULLS FIRST

Указывает, что значения null сортируются перед значениями не-null. Это поведение по умолчанию, когда указано DESC

NULLS LAST

Указывает, что значения null сортируются после значений не-null. Это поведение по умолчанию, когда DESC не указано

storage_parameter

Имя параметра хранения, специфичного для метода индексирования. Каждый метод индексирования имеет свой собственный набор допустимых параметров хранения

FILLFACTOR — этот параметр принимают методы индексирования B-tree, bitmap, GiST и SP-GiST. FILLFACTOR для индекса — это процент, который определяет, насколько плотно метод индексирования будет пытаться упаковать страницы индекса. Для B-деревьев листовые страницы заполняются до этого процента во время первоначального построения индекса, а также при расширении индекса вправо в структуре дерева (добавлении новых наибольших значений ключа). Если впоследствии страницы будут полностью заполнены, они будут разделены, что приведет к постепенному снижению эффективности индекса. B-деревья используют коэффициент заполнения по умолчанию 90, но можно выбрать любое целое значение от 10 до 100. Если таблица статична, то лучше всего использовать коэффициент заполнения 100, чтобы минимизировать физический размер индекса, но для таблиц с частым обновлением лучше использовать меньший коэффициент заполнения, чтобы минимизировать необходимость разделения страниц. Другие методы индексирования используют коэффициент заполнения различными, но в целом аналогичными способами; коэффициент заполнения по умолчанию варьируется в зависимости от метода.

BUFFERING — в дополнение к FILLFACTOR, индексы GiST дополнительно принимают параметр BUFFERING. Параметр BUFFERING определяет, создает ли Greengage DB индекс с использованием техники буферизации, описанной в разделе GiST buffering build в документации PostgreSQL. При значении OFF она отключена, при ON — включена, а при AUTO — изначально отключена, но включается "на лету", как только размер индекса достигает эффективного размера кеша (effective_cache_size). По умолчанию установлено значение AUTO.

FASTUPDATE — метод индексирования GIN принимает параметр хранения FASTUPDATE. FASTUPDATE — это логический параметр, который отключает или включает технику быстрого обновления индекса GIN. Значение ON включает быстрое обновление (по умолчанию), а OFF — отключает его. Дополнительную информацию см. в разделе GIN fast update technique в документации PostgreSQL.

ПРИМЕЧАНИЕ

Отключение FASTUPDATE с помощью ALTER INDEX предотвращает попадание будущих вставок в список ожидающих записей индекса, но само по себе не сбрасывает предыдущие записи. Возможно, потребуется выполнить команду VACUUM для таблицы, чтобы гарантированно очистить список ожидающих записей.

tablespace_name

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

predicate

Выражение ограничения для частичного индекса

Примечания

Для методов индексирования, поддерживающих упорядоченное сканирование (в настоящее время только B-tree), могут быть указаны необязательные выражения ASC, DESC, NULLS FIRST и/или NULLS LAST для изменения порядка сортировки индекса. Поскольку упорядоченный индекс можно сканировать как в прямом, так и в обратном направлении, создание одностолбцового индекса DESC обычно нецелесообразно — такой порядок сортировки уже доступен при использовании обычного индекса. Ценность этих опций заключается в том, что можно создавать многостолбцовые индексы, соответствующие порядку сортировки, запрашиваемому запросом со смешанным порядком, таким как SELECT …​ ORDER BY x ASC, y DESC. Опции NULLS полезны, если вам нужно поддержать поведение "nulls sort low" вместо поведения по умолчанию "nulls sort high" в запросах, которые зависят от индексов для исключения шагов сортировки.

Для большинства методов индексирования скорость создания индекса зависит от значения параметра maintenance_work_mem. Более высокие значения сократят время, необходимое для создания индекса, при условии, что вы не сделаете его больше объема реально доступной памяти, что приведет к переходу системы в режим подкачки (swapping).

При создании индекса для партиционированной таблицы индекс распространяется на все дочерние таблицы, созданные в Greengage DB. Создание индекса для таблицы, созданной Greengage DB для использования партиционированной таблицей, не поддерживается.

Уникальные индексы (UNIQUE) разрешены только в том случае, если столбцы индекса совпадают со столбцами ключа распределения Greengage DB (или являются их надмножеством).

Уникальные индексы (UNIQUE) не разрешены для append-optimized таблиц.

Уникальный индекс (UNIQUE) может быть создан для партиционированной таблицы. Однако уникальность обеспечивается только внутри партиции; уникальность не обеспечивается между партициями. Например, для партиционированной таблицы с партициями по году и под-партициями по кварталу уникальность обеспечивается только в каждой отдельной под-партициями квартала. Уникальность не обеспечивается между под-партициями кварталов.

По умолчанию индексы не используются для выражений IS NULL. Лучший способ использовать индексы в таких случаях — создать частичный индекс с использованием предиката IS NULL.

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

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

В предыдущих версиях Greengage DB также был метод индексирования R-tree. Этот метод был удален, так как он не имел существенных преимуществ перед методом GiST. Если указано USING rtree, CREATE INDEX будет интерпретировать это как USING gist.

Для получения дополнительной информации о типе индекса GiST обратитесь к документации PostgreSQL.

Использование хеш-индексов (hash indexes) в Greengage DB отключено.

Примеры

Создать индекс с методом B-tree для столбца title в таблице films:

CREATE UNIQUE INDEX title_idx ON films (title);

Создать индекс с методом bitmap для столбца gender в таблице employee:

CREATE INDEX gender_bmp_idx ON employee USING bitmap (gender);

Создать индекс для выражения lower(title), обеспечивающий эффективный поиск без учета регистра:

CREATE INDEX ON films ((lower(title)));

В этом примере не указано имя индекса, поэтому система выберет его сама, обычно это будет films_lower_idx.

Создать индекс с правилом сортировки не по умолчанию:

CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");

Создать индекс с коэффициентом заполнения (fill factor) не по умолчанию:

CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);

Создать индекс GIN с отключенным быстрым обновлением:

CREATE INDEX gin_idx ON documents_table USING gin (locations) WITH (fastupdate = off);

Создать индекс для столбца code в таблице films и разместить индекс в табличном пространстве indexspace:

CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;

Создать индекс GiST для атрибута точки, чтобы можно было эффективно использовать операторы для работы с прямоугольниками с результатами функции преобразования:

CREATE INDEX pointloc ON points USING gist (box(location, location));

SELECT *
FROM points
WHERE box(location, location) && '(0,0),(1,1)'::box;

Совместимость

CREATE INDEX является расширением языка Greengage DB. В стандарте SQL не предусмотрены средства для работы с индексами. Greengage DB не поддерживает одновременное создание индексов (ключевое слово CONCURRENTLY не поддерживается).

См. также