CREATE INDEX — создание нового индекса
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ]name] ON [ ONLY ]table_name[ USINGmethod] ( {column_name| (expression) } [ COLLATEcollation] [opclass[ (opclass_parameter=value[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) [ INCLUDE (column_name[, ...] ) ] [ NULLS [ NOT ] DISTINCT ] [ WITH (storage_parameter[=value] [, ... ] ) ] [ TABLESPACEtablespace_name] [ WHEREpredicate]
Команда CREATE INDEX строит индекс по указанному столбцу(столбцам) указанного отношения, которым может быть таблица или материализованное представление. Индексы в основном используются для повышения производительности базы данных (хотя неуместное использование может привести к замедлению).
Ключевые поля индекса указываются в виде имён столбцов или, альтернативно, в виде выражений в круглых скобках. Несколько полей могут быть указаны, если метод индекса поддерживает многоколоночные индексы.
Поле индекса может быть выражением, вычисленным на основе значений одного или нескольких столбцов строки таблицы. Эта возможность может использоваться для быстрого доступа к данным на основе некоторого преобразования базовых данных. Например, индекс, вычисленный по upper(col), позволил бы предложению WHERE upper(col) = 'JIM' использовать индекс.
Digital Q.DataBase предоставляет методы индексов B-дерева, хэша, GiST, SP-GiST, GIN и BRIN. Пользователи также могут определять собственные методы индексов, но это довольно сложно.
Когда присутствует предложение WHERE, создаётся частичный индекс. Частичный индекс — это индекс, который содержит записи только для части таблицы, обычно для той части, которая более полезна для индексирования, чем остальная часть таблицы. Например, если у вас есть таблица, содержащая как выставленные, так и не выставленные счета, причём невыставленные счета составляют небольшую часть общей таблицы, но это часто используемый раздел, вы можете повысить производительность, создав индекс только для этой части. Ещё одно возможное применение — использование WHERE вместе с UNIQUE для обеспечения уникальности подмножества таблицы. Более подробное обсуждение см. в разделе Раздел 2.8.8.
Выражение, используемое в предложении WHERE, может ссылаться только на столбцы базовой таблицы, но может использовать все столбцы, а не только индексируемые. В настоящее время подзапросы и агрегатные выражения также запрещены в WHERE. Те же ограничения применяются к полям индекса, которые являются выражениями.
Все функции и операторы, используемые в определении индекса, должны быть «неизменяемыми», то есть их результаты должны зависеть только от их аргументов и никогда от внешних влияний (таких как содержимое другой таблицы или текущее время). Это ограничение гарантирует, что поведение индекса хорошо определено. Чтобы использовать пользовательскую функцию в выражении индекса или в предложении WHERE, не забудьте пометить функцию как неизменяемую при её создании.
UNIQUEЗаставляет систему проверять наличие дублирующихся значений в таблице при создании индекса (если данные уже существуют) и каждый раз при добавлении данных. Попытки вставить или обновить данные, которые привели бы к дублирующимся записям, вызовут ошибку.
Дополнительные ограничения применяются, когда уникальные индексы используются на секционированных таблицах; см. CREATE TABLE.
CONCURRENTLYПри использовании этого параметра Digital Q.DataBase будет строить индекс без взятия блокировок, препятствующих одновременным операциям вставки, обновления или удаления в таблице; тогда как стандартное построение индекса блокирует операции записи (но не чтения) в таблице до его завершения. Существует несколько предостережений при использовании этого параметра — см. Building Indexes Concurrently ниже.
Для временных таблиц команда CREATE INDEX всегда выполняется неконкурентно, так как никакие другие сеансы не могут получить к ним доступ, и неконкурентное создание индекса дешевле.
IF NOT EXISTS
Не вызывать ошибку, если отношение с таким именем уже существует. В этом случае выдаётся уведомление. Обратите внимание, что нет гарантии, что существующий индекс хоть как-то похож на тот, который был бы создан. Имя индекса требуется, когда указано IF NOT EXISTS.
INCLUDE
Необязательное предложение INCLUDE задаёт список столбцов, которые будут включены в индекс как неключевые столбцы. Неключевой столбец нельзя использовать в условии поиска при сканировании индекса, и он игнорируется для целей любого ограничения уникальности или исключения, обеспечиваемого индексом. Однако индексное сканирование (index-only scan) может возвращать содержимое неключевых столбцов без необходимости обращения к таблице индекса, поскольку они доступны непосредственно из записи индекса. Таким образом, добавление неключевых столбцов позволяет использовать индексные сканирования для запросов, которые в противном случае не могли бы их использовать.
Следует осторожно подходить к добавлению неключевых столбцов в индекс, особенно широких столбцов. Если кортеж индекса превышает максимальный размер, разрешённый для типа индекса, вставка данных завершится ошибкой. В любом случае неключевые столбцы дублируют данные из таблицы индекса и увеличивают размер индекса, что потенциально замедляет поиск. Более того, дедупликация B-дерева никогда не используется с индексами, имеющими неключевой столбец.
Столбцы, перечисленные в предложении INCLUDE, не требуют соответствующих классов операторов; предложение может включать столбцы, типы данных которых не имеют определённых классов операторов для данного метода доступа.
Выражения не поддерживаются в качестве включаемых столбцов, поскольку они не могут использоваться в индексных сканированиях.
В настоящее время методы доступа к индексам B-дерева, GiST и SP-GiST поддерживают эту возможность. В этих индексах значения столбцов, перечисленных в предложении INCLUDE, включаются в листовые кортежи, соответствующие кортежам кучи, но не включаются в записи индекса верхнего уровня, используемые для навигации по дереву.
nameИмя создаваемого индекса. Имя схемы не может быть указано здесь; индекс всегда создаётся в той же схеме, что и его родительская таблица. Имя индекса должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления, материализованного представления или сторонней таблицы) в этой схеме. Если имя опущено, Digital Q.DataBase выбирает подходящее имя на основе имени родительской таблицы и имен индексируемых столбцов.
ONLYУказывает не рекурсивно создавать индексы на разделах, если таблица секционирована. По умолчанию выполняется рекурсивное создание.
table_nameИмя (возможно, с указанием схемы) таблицы, для которой создаётся индекс.
method
Имя метода индекса для использования. Варианты: btree, hash, gist, spgist, gin, brin или пользовательские методы доступа, такие как bloom. Метод по умолчанию — btree.
column_nameИмя столбца таблицы.
expressionВыражение, основанное на одном или нескольких столбцах таблицы. Выражение обычно должно быть записано в круглых скобках, как показано в синтаксисе. Однако скобки могут быть опущены, если выражение имеет форму вызова функции.
collationИмя сортировки для использования в индексе. По умолчанию индекс использует сортировку, объявленную для индексируемого столбца, или результирующую сортировку индексируемого выражения. Индексы с сортировкой, отличной от стандартной, могут быть полезны для запросов, включающих выражения с нестандартными сортировками.
opclassИмя класса операторов. Подробности см. ниже.
opclass_parameterИмя параметра класса операторов. Подробности см. ниже.
ASCЗадаёт порядок сортировки по возрастанию (по умолчанию).
DESCЗадаёт порядок сортировки по убыванию.
NULLS FIRST
Указывает, что значения NULL сортируются перед не-NULL значениями. Это поведение по умолчанию, когда указано DESC.
NULLS LAST
Указывает, что значения NULL сортируются после не-NULL значений. Это поведение по умолчанию, когда DESC не указано.
NULLS DISTINCTNULLS NOT DISTINCTУказывает, следует ли для уникального индекса считать значения NULL различными (не равными). По умолчанию они считаются различными, поэтому уникальный индекс может содержать несколько значений NULL в столбце.
storage_parameterИмя параметра хранения, специфичного для метода индекса. Подробности см. в разделе Index Storage Parameters ниже.
tablespace_nameТабличное пространство, в котором создаётся индекс. Если не указано, используется default_tablespace или temp_tablespaces для индексов на временных таблицах.
predicateВыражение ограничения для частичного индекса.
Необязательное предложение WITH задаёт параметры хранения для индекса. Каждый метод индекса имеет свой собственный набор допустимых параметров хранения. Методы индекса B-дерева, хэша, GiST и SP-GiST все принимают этот параметр:
fillfactor (integer)
#
Коэффициент заполнения (fillfactor) для индекса — это процент, определяющий, насколько полно метод индекса будет пытаться заполнять страницы индекса. Для B-деревьев листовые страницы заполняются до этого процента во время первоначального построения индекса, а также при расширении индекса справа (добавлении новых наибольших значений ключа). Если страницы впоследствии становятся полностью заполненными, они будут разделены, что приводит к фрагментации структуры индекса на диске. B-деревья используют коэффициент заполнения по умолчанию 90, но можно выбрать любое целое значение от 10 до 100.
Индексы B-дерева на таблицах, где ожидается много вставок и/или обновлений, могут выиграть от более низких значений коэффициента заполнения при выполнении CREATE INDEX (после массовой загрузки в таблицу). Значения в диапазоне 50 - 90 могут полезно «сгладить» скорость разделения страниц на раннем этапе жизни индекса B-дерева (такое снижение коэффициента заполнения может даже снизить абсолютное количество разделений страниц, хотя этот эффект сильно зависит от рабочей нагрузки). Техника удаления индекса B-дерева снизу вверх, описанная в Раздел 7.14.1.4.2, зависит от наличия «дополнительного» места на страницах для хранения «дополнительных» версий кортежей и поэтому может зависеть от коэффициента заполнения (хотя эффект обычно незначителен).
В других конкретных случаях может быть полезно увеличить коэффициент заполнения до 100 при выполнении CREATE INDEX как способ максимизировать использование пространства. Следует рассматривать этот вариант только тогда, когда вы полностью уверены, что таблица статична (т.е. на неё никогда не будут влиять ни вставки, ни обновления). В противном случае установка коэффициента заполнения в 100 рискует навредить производительности: даже несколько обновлений или вставок вызовут внезапный поток разделений страниц.
Другие методы индекса используют коэффициент заполнения по-разному, но примерно аналогичным образом; стандартное значение коэффициента заполнения различается между методами.
Индексы B-дерева дополнительно принимают этот параметр:
deduplicate_items (boolean)
#
Управляет использованием техники дедупликации B-дерева, описанной в Раздел 7.14.1.4.3. Установите в ON или OFF, чтобы включить или отключить оптимизацию. (Допускаются альтернативные написания ON и OFF, как описано в Раздел 3.4.1.) По умолчанию — ON.
Отключение deduplicate_items с помощью ALTER INDEX предотвращает активацию дедупликации будущими вставками, но само по себе не заставляет существующие кортежи списка публикаций использовать стандартное представление кортежа.
Индексы GiST дополнительно принимают этот параметр:
buffering (enum)
#
Определяет, используется ли для построения индекса техника буферизованного построения, описанная в Раздел 7.14.2.4.1. При значении OFF буферизация отключена, при ON — включена, а при AUTO — изначально отключена, но включается на лету, как только размер индекса достигает effective_cache_size. По умолчанию используется AUTO.
Обратите внимание, что если возможно отсортированное построение, оно будет использоваться вместо буферизованного построения, если не указано buffering=ON.
Индексы GIN принимают другие параметры:
fastupdate (boolean)
#
Этот параметр управляет использованием техники быстрого обновления, описанной в Раздел 7.14.4.4.1. Это логический параметр: ON включает быстрое обновление, OFF отключает его. По умолчанию — ON.
Отключение fastupdate с помощью ALTER INDEX предотвращает попадание будущих вставок в список ожидающих записей индекса, но само по себе не сбрасывает предыдущие записи. Возможно, вы захотите выполнить VACUUM для таблицы или вызвать функцию gin_clean_pending_list после этого, чтобы убедиться, что список ожидания очищен.
gin_pending_list_limit (integer)
#Пользовательский параметр gin_pending_list_limit. Это значение указывается в килобайтах.
Индексы BRIN принимают другие параметры:
pages_per_range (integer)
#
Определяет количество блоков таблицы, составляющих один диапазон блоков для каждой записи индекса BRIN (подробнее см. Раздел 7.14.5.1). По умолчанию — 128.
autosummarize (boolean)
#
Определяет, ставится ли в очередь сеанс обобщения для предыдущего диапазона страниц при обнаружении вставки в следующий диапазон. Подробнее см. Раздел 7.14.5.1.1. По умолчанию — off.
Создание индекса может мешать нормальной работе базы данных. Обычно Digital Q.DataBase блокирует таблицу, для которой строится индекс, от операций записи и выполняет всё построение индекса с помощью одного сканирования таблицы. Другие транзакции по-прежнему могут читать таблицу, но если они попытаются вставить, обновить или удалить строки в таблице, они будут заблокированы до завершения построения индекса. Это может оказать серьёзное влияние, если система является действующей рабочей базой данных. Очень большие таблицы могут индексироваться много часов, и даже для меньших таблиц построение индекса может блокировать операции записи на периоды, неприемлемо долгие для рабочей системы.
Digital Q.DataBase поддерживает построение индексов без блокировки операций записи. Этот метод вызывается указанием параметра CONCURRENTLY команды CREATE INDEX. Когда используется этот параметр, Digital Q.DataBase должен выполнить два сканирования таблицы и, кроме того, должен дождаться завершения всех существующих транзакций, которые потенциально могли бы изменить или использовать индекс. Таким образом, этот метод требует больше общей работы, чем стандартное построение индекса, и занимает значительно больше времени. Однако, поскольку он позволяет продолжать нормальные операции во время построения индекса, этот метод полезен для добавления новых индексов в рабочей среде. Конечно, дополнительная нагрузка на ЦП и ввод-вывод, создаваемая построением индекса, может замедлить другие операции.
При конкурентном построении индекса индекс фактически вводится как «недействительный» индекс в системные каталоги в одной транзакции, затем два сканирования таблицы происходят в двух дополнительных транзакциях. Перед каждым сканированием таблицы построение индекса должно дождаться завершения существующих транзакций, которые изменили таблицу. После второго сканирования построение индекса должно дождаться завершения любых транзакций, имеющих снимок (см. Глава 2.10), предшествующий второму сканированию, включая транзакции, используемые любой фазой конкурентного построения индексов на других таблицах, если задействованные индексы являются частичными или имеют столбцы, не являющиеся простыми ссылками на столбцы. Затем наконец индекс может быть помечен как «действительный» и готовый к использованию, и команда CREATE INDEX завершается. Однако даже тогда индекс может быть недоступен для запросов немедленно: в худшем случае его нельзя использовать до тех пор, пока существуют транзакции, предшествующие началу построения индекса.
Если во время сканирования таблицы возникает проблема, такая как взаимоблокировка или нарушение уникальности в уникальном индексе, команда CREATE INDEX завершится ошибкой, но оставит после себя «недействительный» индекс. Этот индекс будет игнорироваться для целей запросов, потому что он может быть неполным; однако он по-прежнему будет потреблять накладные расходы на обновление. Команда psql \d будет сообщать о таком индексе как INVALID:
postgres=# \d tab
Table "public.tab"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
col | integer | | |
Indexes:
"idx" btree (col) INVALID
Рекомендуемый метод восстановления в таких случаях — удалить индекс и попытаться снова выполнить CREATE INDEX CONCURRENTLY. (Другая возможность — перестроить индекс с помощью REINDEX INDEX CONCURRENTLY).
Ещё одно предостережение при конкурентном построении уникального индекса заключается в том, что ограничение уникальности уже начинает применяться к другим транзакциям, когда начинается второе сканирование таблицы. Это означает, что нарушения ограничений могут сообщаться в других запросах до того, как индекс станет доступен для использования, или даже в случаях, когда построение индекса в конечном итоге завершается ошибкой. Кроме того, если во втором сканировании происходит сбой, «недействительный» индекс продолжает применять своё ограничение уникальности впоследствии.
Поддерживается конкурентное построение индексов по выражениям и частичных индексов. Ошибки, возникающие при вычислении этих выражений, могут вызывать поведение, аналогичное описанному выше для нарушений ограничений уникальности.
Стандартное построение индексов допускает одновременное выполнение других стандартных построений индексов на той же таблице, но только одно конкурентное построение индекса может происходить на таблице в любой момент времени. В любом случае изменение схемы таблицы не допускается во время построения индекса. Ещё одно отличие заключается в том, что обычная команда CREATE INDEX может быть выполнена внутри блока транзакции, но CREATE INDEX CONCURRENTLY — нет.
В настоящее время не поддерживается конкурентное построение индексов на секционированных таблицах. Однако вы можете конкурентно построить индекс на каждом разделе отдельно, а затем окончательно создать секционированный индекс неконкурентно, чтобы сократить время, в течение которого операции записи в секционированную таблицу будут заблокированы. В этом случае построение секционированного индекса является операцией только над метаданными.
Информацию о том, когда индексы могут использоваться, когда они не используются и в каких конкретных ситуациях они могут быть полезны, см. в разделе Глава 2.8.
В настоящее время только методы индексов B-дерева, GiST, GIN и BRIN поддерживают индексы с несколькими ключевыми столбцами. Возможность наличия нескольких ключевых столбцов не зависит от того, можно ли добавлять столбцы INCLUDE в индекс. Индексы могут содержать до 32 столбцов, включая столбцы INCLUDE.
(Это ограничение может быть изменено при сборке Digital Q.DataBase.) Только B-дерево в настоящее время поддерживает уникальные индексы.
Класс операторов с необязательными параметрами может быть указан для каждого столбца индекса.
Класс операторов идентифицирует операторы, которые будут использоваться индексом для этого столбца. Например, индекс B-дерева по четырёхбайтовым целым числам будет использовать класс int4_ops; этот класс операторов включает функции сравнения для четырёхбайтовых целых чисел. На практике стандартного класса операторов для типа данных столбца обычно достаточно. Основная цель наличия классов операторов заключается в том, что для некоторых типов данных может существовать более одного значимого порядка. Например, мы можем захотеть отсортировать тип данных комплексного числа либо по абсолютному значению, либо по действительной части. Мы могли бы сделать это, определив два класса операторов для типа данных, а затем выбрав подходящий класс при создании индекса. Дополнительная информация о классах операторов содержится в разделах Раздел 2.8.10 и Раздел 5.1.16.
Когда CREATE INDEX вызывается для секционированной таблицы, поведение по умолчанию — рекурсивно обработать все разделы, чтобы гарантировать, что все они имеют соответствующие индексы.
Сначала проверяется каждый раздел, чтобы определить, существует ли уже эквивалентный индекс, и если да, то этот индекс будет присоединён как индекс раздела к создаваемому индексу, который станет его родительским индексом.
Если соответствующий индекс не существует, будет создан новый индекс и автоматически присоединён; имя нового индекса в каждом разделе будет определяться так, как если бы имя индекса не было указано в команде.
Если указана опция ONLY, рекурсия не выполняется, и индекс помечается как недействительный.
(ALTER INDEX ... ATTACH PARTITION помечает индекс действительным, как только все разделы получат соответствующие индексы.) Однако обратите внимание, что любой раздел, созданный в будущем с помощью CREATE TABLE ... PARTITION OF, будет автоматически иметь соответствующий индекс, независимо от того, указана ли опция ONLY.
Для методов индекса, поддерживающих упорядоченное сканирование (в настоящее время только B-дерево), необязательные предложения ASC, DESC, NULLS FIRST и/или NULLS LAST могут быть указаны для изменения порядка сортировки индекса. Поскольку упорядоченный индекс может сканироваться как в прямом, так и в обратном направлении, обычно нет необходимости создавать одноколоночный индекс DESC — такой порядок сортировки уже доступен с обычным индексом. Ценность этих опций заключается в том, что можно создавать многоколоночные индексы, соответствующие порядку сортировки, запрошенному запросом со смешанным порядком, таким как SELECT ... ORDER BY x ASC, y DESC. Опции NULLS полезны, если вам нужно поддерживать поведение «NULL сортируются низко», а не стандартное «NULL сортируются высоко», в запросах, которые зависят от индексов, чтобы избежать шагов сортировки.
Система регулярно собирает статистику по всем столбцам таблицы. Вновь созданные индексы, не основанные на выражениях, могут немедленно использовать эту статистику для определения полезности индекса.
Для новых индексов по выражениям необходимо выполнить ANALYZE или дождаться, пока фоновый процесс автоочистки проанализирует таблицу, чтобы сгенерировать статистику для этих индексов.
Во время выполнения CREATE INDEX временно меняется search_path на pg_catalog, pg_temp.
Для большинства методов индекса скорость создания индекса зависит от настройки maintenance_work_mem. Большие значения сократят время, необходимое для создания индекса, при условии, что вы не сделаете его больше, чем реально доступный объём памяти, что приведёт к свопингу машины.
Digital Q.DataBase может строить индексы, используя несколько ЦП для более быстрой обработки строк таблицы.
Эта возможность известна как параллельное построение индекса. Для методов индекса, поддерживающих построение индексов параллельно (в настоящее время B-дерево и BRIN), maintenance_work_mem указывает максимальный объём памяти, который может использоваться каждой операцией построения индекса в целом, независимо от того, сколько рабочих процессов было запущено.
Как правило, модель стоимости автоматически определяет, сколько рабочих процессов следует запросить, если таковые вообще требуются.
Параллельное построение индексов может выиграть от увеличения maintenance_work_mem там, где эквивалентное последовательное построение индекса увидит небольшую пользу или не увидит её вовсе. Обратите внимание, что maintenance_work_mem может влиять на количество запрашиваемых рабочих процессов, поскольку параллельные рабочие должны иметь как минимум 32MB долю общего бюджета maintenance_work_mem. Также должна оставаться доля 32MB для ведущего процесса.
Увеличение max_parallel_maintenance_workers может позволить использовать больше рабочих процессов, что сократит время, необходимое для создания индекса, при условии, что построение индекса не ограничивается вводом-выводом. Конечно, также должна быть достаточная мощность ЦП, которая в противном случае простаивала бы.
Установка значения для parallel_workers с помощью ALTER TABLE напрямую управляет количеством параллельных рабочих процессов, которые будут запрошены командой CREATE INDEX для таблицы. Это полностью обходит модель стоимости и предотвращает влияние maintenance_work_mem на количество запрашиваемых параллельных рабочих процессов. Установка parallel_workers в 0 с помощью ALTER TABLE отключит параллельное построение индексов на таблице во всех случаях.
Возможно, вы захотите сбросить parallel_workers после его установки в рамках настройки построения индекса. Это предотвращает непреднамеренные изменения планов запросов, поскольку parallel_workers влияет на все параллельные сканирования таблиц.
В то время как CREATE INDEX с опцией CONCURRENTLY поддерживает параллельное построение без специальных ограничений, только первое сканирование таблицы фактически выполняется параллельно.
Используйте DROP INDEX для удаления индекса.
Как и любая длительная транзакция, CREATE INDEX для таблицы может влиять на то, какие кортежи могут быть удалены параллельным VACUUM на любой другой таблице.
В предыдущих выпусках Digital Q.DataBase также был метод индекса R-дерева. Этот метод был удалён, поскольку он не имел значительных преимуществ перед методом GiST.
Если указано USING rtree, команда CREATE INDEX интерпретирует это как USING gist, чтобы упростить преобразование старых баз данных в GiST.
Каждый фоновый процесс, выполняющий CREATE INDEX, будет сообщать о своём прогрессе в представлении pg_stat_progress_create_index. Подробности см. в разделе Раздел 3.12.4.4.
Создать уникальный индекс B-дерева по столбцу title в таблице films:
CREATE UNIQUE INDEX title_idx ON films (title);
Создать уникальный индекс B-дерева по столбцу title с включёнными столбцами director и rating в таблице films:
CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);
Создать индекс B-дерева с отключённой дедупликацией:
CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);
Создать индекс по выражению lower(title), позволяющий эффективно выполнять регистронезависимый поиск:
CREATE INDEX ON films ((lower(title)));
(В этом примере мы решили опустить имя индекса, поэтому система выберет имя, обычно films_lower_idx.)
Создать индекс с нестандартной сортировкой:
CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");
Создать индекс с нестандартным порядком сортировки значений NULL:
CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);
Создать индекс с нестандартным коэффициентом заполнения:
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 CONCURRENTLY sales_quantity_index ON sales_table (quantity);
CREATE INDEX является расширением языка Digital Q.DataBase. В стандарте SQL нет положений об индексах.