11.10. Классы операторов и семейства операторов#
11.10. Классы операторов и семейства операторов #
Определение индекса может указывать класс оператора для каждого столбца индекса.
CREATE INDEXname
ONtable
(column
opclass
[ (opclass_options
) ] [sort options
] [, ...]);
Класс оператора определяет операторы, которые будут использоваться индексом
для этого столбца. Например, индекс В-дерева на типе 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 index_method, opclass_name;
Этот запрос показывает все определенные семейства операторов и все операторы, включенные в каждое семейство:
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
, которые предоставляют немного более сложные версии этих запросов.