Типы идентификаторов объектов
Идентификаторы объектов (OID) используются внутри QHB в качестве первичных ключей для различных системных таблиц. Идентификатор объекта представляется типом oid. Также для oid определены следующие типы- псевдонимы: regproc, regprocedure, regoper, regoperator, regclass, regtype, regrole, regnamespace, regconfig и regdictionary. Обзор этих псевдонимов представлен в таблице 26.
В настоящее время тип oid реализован как четырехбайтное целое беззнаковое число. Следовательно, он недостаточно велик, чтобы полностью обеспечить уникальность в больших базах данных или даже в отдельных больших таблицах.
Для самого типа oid помимо сравнения существует всего несколько операций. Однако его можно привести к целому числу, а затем обработать с помощью стандартных целочисленных операторов. (При этом следует опасаться возможной путаницы между знаковыми и беззнаковыми значениями.)
У типов-псевдонимов OID нет собственных операций, кроме специализированных функций ввода и вывода. Эти функции могут принимать и отображать не исходное числовое значение, как тип oid, а символические имена системных объектов. Типы-псевдонимы позволяют упростить поиск объектов по значениям OID. Например, чтобы выбрать из pg_attribute строки, относящиеся к таблице mytable, можно написать:
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
вместо:
SELECT * FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');
Хотя второй запрос сам по себе не так уж плох, он все равно чересчур упрощен. Если в разных схемах есть несколько таблиц с именем mytable, то для выбора правильного OID потребуется гораздо более сложный субзапрос. Преобразователь вводимого значения типа regclass находит таблицу в соответствии с настройкой пути к схеме, поэтому автоматически выполняет «правильные действия». Точно так же приведение OID таблицы к типу regclass удобно для символического отображения числового OID.
Таблица 26. Типы идентификаторов объектов
Имя | Ссылки | Описание | Пример значения |
---|---|---|---|
oid | Любые | числовой идентификатор объекта | 564182 |
regproc | pg_proc | имя функции | sum |
regprocedure | pg_proc | функция с типами аргументов | sum(int4) |
regoper | pg_operator | имя оператора | + |
regoperator | pg_operator | оператор с типами аргументов | *(integer,integer) или -(NONE,integer) |
regclass | pg_class | имя отношения | pg_type |
regtype | pg_type | имя типа данных | integer |
regrole | pg_authid | имя роли | smithee |
regnamespace | pg_namespace | имя пространства имен | pg_catalog |
regconfig | pg_ts_config | конфигурация текстового поиска | english |
regdictionary | pg_ts_dict | словарь текстового поиска | simple |
Все типы-псевдонимы OID для объектов, сгруппированных в пространстве имен, принимают имена, дополненные именем схемы, и будут выводить имена со схемой, если этот объект нельзя найти в текущем пути поиска без имени схемы. Типы- псевдонимы regproc и regoper принимают только уникальные вводимые имена (не перегруженные), поэтому их использование ограничено; в большинстве случаев больше подходят regprocedure или regoperator. Для regoperator при определении унарных операторов вместо неиспользуемого операнда записывается слово NONE.
Дополнительным свойством большинства типов-псевдонимов OID является создание зависимостей. Если в сохраненном выражении (например, в выражении столбца по умолчанию или в представлении) появляется константа одного из этих типов, она создает зависимость от ссылочного объекта. Например, если у столбца выражение по умолчанию nextval(’my_seq’::regclass), QHB понимает, что это выражение зависит от последовательности my_seq; система не позволит удалить последовательность, не удалив предварительно выражение по умолчанию. Тип regrole является единственным исключением для этого свойства. Константы этого типа в таких выражениях не допускаются.
Примечание
Типы-псевдонимы OID не вполне соответствуют правилам изоляции транзакций. Планировщик также воспринимает их как простые константы, что может привести к неоптимальному планированию.
Другим типом идентификатора, используемым системой, является xid, или идентификатор транзакции (сокращенно xact). Это тип данных системных столбцов xmin и xmax. Идентификаторы транзакции являются 32-битными величинами.
Третий тип идентификатора, используемый системой, — cid, или идентификатор команды. Это тип данных системных столбцов cmin и cmax. Идентификаторы команд также являются 32-битными величинами.
Последний тип идентификатора, используемый системой, — это tid, или идентификатор кортежа (идентификатор строки). Это тип данных системного столбца ctid. ID кортежа — это пара (номер блока, индекс кортежа в блоке), которая определяет физическое расположение строки в таблице.
(Более подробно системные столбцы рассматриваются в разделе Системные столбцы).