В определении индекса можно указать класса операторов для каждого столбца индекса.
CREATE INDEXимяONтаблица(столбецopclass[ (opclass_options) ] [параметры сортировки] [, ...]);
Класс операторов определяет набор операторов, которые будут использоваться индексом для конкретного столбца. Например, индекс B-дерево для типа int4
будет использовать int4_ops класс; данный класс
операторов включает функции сравнения для значений типа int4. На практике обычно достаточно класса операторов по умолчанию для типа данных столбца. Основная причина существования классов операторов заключается в том, что для некоторых типов данных может быть предусмотрено несколько вариантов поведения индекса. Например, может потребоваться отсортировать данные типа комплексных чисел либо по абсолютному значению, либо по действительной части. Это можно реализовать, определив два класса операторов для этого типа данных и выбрав соответствующий класс при создании индекса. Класс операторов определяет
базовый порядок сортировки (который затем можно изменить, добавив параметры сортировки
COLLATE,
ASC/DESC и (или)
NULLS FIRST/NULLS LAST).
Помимо классов по умолчанию, существуют также некоторые встроенные классы операторов:
Классы операторов text_pattern_ops,
varchar_pattern_ops, и
bpchar_pattern_ops поддерживают индексы B-дерево для
типов text, varchar, и
char соответственно. Основное отличие от классов операторов по умолчанию заключается в том, что значения сравниваются строго посимвольно, а не в соответствии с правилами сортировки конкретной локали. Благодаря этому данные классы операторов подходят для использования в запросах с выражениями сопоставления по шаблону (LIKE или регулярные выражения POSIX), когда база данных не использует стандартный
«C» локаль. В качестве примера можно создать индекс для
varchar столбца следующим образом:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
Обратите внимание, что также следует создать индекс с классом операторов по умолчанию, если планируется использовать индекс в запросах с обычными операторами <,
<=, >, или >= сравнения для использования индекса. Такие запросы не могут использовать
классы операторов. (Однако для обычных сравнений на равенство можно использовать эти классы операторов.) Допускается создание нескольких индексов для одного и того же столбца с различными классами операторов. Если используется локаль C, нет необходимости в применении
xxx_pattern_ops
классов операторов, так как индекс с классом операторов по умолчанию подходит для запросов с сопоставлением по шаблону в локали C.
xxx_pattern_ops
Следующий запрос выводит все определенные классы операторов:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
FROM pg_am am, pg_opclass opc
WHERE opc.opcmethod = am.oid
ORDER BY index_method, opclass_name;
Класс операторов фактически представляет собой лишь подмножество более крупной структуры, называемой семейство операторов. В случаях, когда несколько типов данных демонстрируют схожее поведение, часто бывает полезно определить межтиповые операторы и обеспечить их работу с индексами. Для этого классы операторов для каждого из типов должны быть сгруппированы в одно и то же семейство операторов. Операторы, работающие с разными типами данных, являются членами семейства, но не связаны с каким-либо отдельным классом внутри этого семейства.
Данная расширенная версия предыдущего запроса позволяет увидеть семейство операторов, к которому относится каждый класс операторов:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opf.opfname AS имя семейства операторов opfamily_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
FROM pg_am am, pg_opclass opc, pg_opfamily opf
WHERE opc.opcmethod = am.oid AND
opc.opcfamily = opf.oid
ORDER BY метод_индекса, имя_класса_операторов;
Данный запрос выводит все определенные семейства операторов и все операторы, входящие в каждое семейство:
SELECT am.amname AS index_method,
opf.opfname AS имя семейства операторов opfamily_name,
amop.amopopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid
ORDER BY index_method, opfamily_name, opfamily_operator;
psql содержит
команды \dAc, \dAf,
и \dAo, которые предоставляют несколько более сложные версии этих запросов.