Начало работы
Подключение
Тесты производительности
Развёртывание
Использование данных
Загрузка данных
Миграция данных
Запрос данных
Управление кластерами
Обновление
Глобальное обслуживание
Масштабирование
Мониторинг
Безопасность
Лучшие практики
Технические принципы
Типы данных
Хранилище
Исполняющий движок
Потоковая обработка (Domino)
MARS3 Индексы
Расширения
Расширенные функции
Расширенный запрос
Федеративные запросы
Grafana
Резервное копирование и восстановление
Аварийное восстановление
Руководство
Настройка производительности
Устранение неполадок
Инструменты
Параметры конфигурации
SQL-команда
Часто задаваемые вопросы
Определяет новый класс операторов.
CREATE OPERATOR CLASS <name> [DEFAULT] FOR TYPE <data_type>
USING <index_method> [ FAMILY <family_name> ] AS
{ OPERATOR <strategy_number> <operator_name> [ ( <op_type>, <op_type> ) ] [ FOR SEARCH | FOR ORDER BY <sort_family_name> ]
| FUNCTION <support_number> [ ( <op_type> [ , <op_type> ] ) ] <function_name> (<argument_type> [, ...] )
| STORAGE <storage_type>
} [, ... ]
CREATE OPERATOR CLASS создаёт новый класс операторов. Класс операторов определяет, как конкретный тип данных может использоваться с индексом. Класс операторов указывает, что определённые операторы будут выполнять определённые роли или стратегии для данного типа данных и метода индекса. Класс операторов также определяет вспомогательные функции, которые будут использоваться методом индекса при выборе этого класса операторов для столбца индекса. Все операторы и функции, используемые классом операторов, должны быть определены до создания самого класса. Все функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.
Если указано имя схемы, то класс операторов создаётся в указанной схеме. В противном случае он создаётся в текущей схеме. Два класса операторов в одной схеме могут иметь одинаковые имена только в том случае, если они предназначены для разных методов индексов.
Пользователь, определивший класс операторов, становится его владельцем. В настоящее время пользователь, создающий класс операторов, должен быть суперпользователем. (Это ограничение введено потому, что некорректное определение класса операторов может привести к путанице или даже аварийному завершению работы сервера.)
В настоящее время команда CREATE OPERATOR CLASS не проверяет, содержит ли определение класса все операторы и функции, требуемые методом индекса, а также не проверяет согласованность набора операторов и функций. Ответственность за создание корректного класса операторов лежит на пользователе.
Связанные классы операторов могут объединяться в семейства операторов. Чтобы добавить новый класс операторов в существующее семейство, укажите параметр FAMILY в команде CREATE OPERATOR CLASS. Без этого параметра новый класс помещается в семейство с тем же именем, что и сам класс (если такое семейство ещё не существует, оно будет создано).
Дополнительную информацию см. в разделе «Интерфейс расширений с индексами» документации PostgreSQL.
name
DEFAULT
data_type
index_method
family_name
strategy_number
operator_name
op_type
В предложении OPERATOR — тип(ы) операндов оператора или NONE, чтобы обозначить унарный оператор слева или справа. Типы операндов можно опустить в обычном случае, когда они совпадают с типом данных класса операторов.
В предложении FUNCTION — тип(ы) операндов, поддержку которых обеспечивает функция, если они отличаются от входных типов данных функции (для функций сравнения B-tree и хэширования) или от типа данных класса (для функций сортировки B-tree и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Эти значения по умолчанию являются корректными, поэтому op_type не нужно указывать в предложениях FUNCTION, за исключением случая функции поддержки сортировки B-tree, предназначенной для сравнения между разными типами данных.
sort_family_name
Имя (возможно, с указанием схемы) существующего семейства операторов btree, описывающего порядок сортировки, связанного с оператором упорядочивания.
Если не указано ни FOR SEARCH, ни FOR ORDER BY, по умолчанию используется FOR SEARCH.
support_number
function_name
argument_type
storage_type
Поскольку механизм индексов не проверяет права доступа к функциям перед их использованием, включение функции или оператора в класс операторов эквивалентно предоставлению общедоступного права EXECUTE на него. Как правило, это не является проблемой для тех функций, которые полезны в классе операторов.
Операторы не должны быть определены с помощью SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать соответствие запроса индексу.
Любые функции, используемые для реализации класса операторов, должны быть определены как IMMUTABLE.
До Database 6.0 в предложении OPERATOR мог быть указан параметр RECHECK. Эта возможность больше не поддерживается. Теперь Database определяет, является ли оператор индекса «потеряющим», динамически во время выполнения. Это позволяет более эффективно обрабатывать случаи, когда оператор может быть или не быть потерянным.
Следующая примерная команда определяет класс операторов GiST для типа данных _int4 (массив int4). Полный пример см. в модуле расширения intarray.
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR 3 &&,
OPERATOR 6 = (anyarray, anyarray),
OPERATOR 7 @>,
OPERATOR 8 <@,
OPERATOR 20 @@ (_int4, query_int),
FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal),
FUNCTION 2 g_int_union (internal, internal),
FUNCTION 3 g_int_compress (internal),
FUNCTION 4 g_int_decompress (internal),
FUNCTION 5 g_int_penalty (internal, internal, internal),
FUNCTION 6 g_int_picksplit (internal, internal),
FUNCTION 7 g_int_same (_int4, _int4, internal);
CREATE OPERATOR CLASS является расширением Database. В стандарте SQL нет оператора CREATE OPERATOR CLASS.
ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY, CREATE FUNCTION