09 Занятие 09: Организация данных / Системный каталог
Исходная страница в нативном Markdown: Организация данных / Системный каталог
Примечание
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета.
HTML source:dba1_09_data_catalog.htmlArchive:DBA1-handouts-16.zipСтраниц PDF: 18
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
Что такое системный каталог и как к нему обращаться
Объекты системного каталога и их расположение
Правила именования объектов
Специальные типы данных
Page 3: Системный каталог
Набор таблиц и представлений, описывающих все объекты кластера баз данных
Схемы
основная схема: pg_catalog
альтернативное представление: information_schema (стандарт SQL)
SQL-доступ
просмотр:SELECTизменение:CREATE,ALTER,DROP
Доступ в psql
специальные команды для удобства просмотра
Комментарии преподавателя
Системный каталог представляет собой набор таблиц и представлений с описанием всех объектов СУБД, «метаинформация» о содержимом кластера: https://postgrespro.ru/docs/postgresql/16/catalogs. Начиная с 14-й версии PostgreSQL для большинства таблиц системного каталога добавлены первичные ключи и ограничения уникальности.
Для доступа к этой информации используются обычные запросы SQL. При помощи команд SELECT можно получить описание любых объектов, а при помощи команд DDL (Data Definition Language) можно добавлять и изменять объекты.
Все таблицы и представления системного каталога располагаются в схеме pg_catalog. Существует и другая схема, предписанная стандартом SQL: information_schema. Она более стабильна и переносима, чем pg_catalog, но не отражает специфику PostgreSQL.
Клиентские программы могут читать содержимое системного каталога и показывать его пользователю в удобном виде. Например, графические среды разработки и управления обычно изображают иерархический «навигатор» объектов.
Наиболее часто используемые из них мы посмотрим в демонстрации. В материалах курса есть файл catalogs.pdf со схемой основных таблиц системного каталога и команд psql для работы с ними.
Page 4: Общие объекты кластера
{#source-figure-004 caption=“Source slide page 4: Общие объекты кластера”}
Комментарии преподавателя
В каждой базе данных кластера создается свой набор таблиц системного каталога. Однако существует несколько объектов каталога, которые являются общими для всего кластера. Наиболее очевидный пример — список самих баз данных.
Эти таблицы хранятся вне какой-либо базы данных, но при этом одинаково видны из каждой БД.
Page 5: Правила именования
Префиксы имен объектов (таблиц, представлений) и столбцов
pg_database.datname
префикс столбцов
(обычно повторяет
общий префикс
всех объектов
имя объекта)
Названия объектов всегда хранятся в нижнем регистре
Комментарии преподавателя
Все таблицы и представления системного каталога начинаются с префикса «pg_». Для предотвращения потенциальных конфликтов, не рекомендуется создавать собственные объекты, начинающиеся с «pg_».
Названия столбцов имеют трехбуквенный префикс, который, как правило, соответствует имени таблицы. После префикса нет знака подчеркивания. Имеются некоторые исключения из этого правила, например, столбец oid и другие.
Названия объектов хранятся в нижнем регистре.
Page 6: Некоторые объекты системного каталога
Создадим базу данных и тестовые объекты:
=>CREATEDATABASEdata_catalog;
CREATEDATABASE
=>\cdata_catalog
You are now connected to database "data_catalog" as user "student".
-[ RECORD 1 ]-----------------------------------------------------------
oid | 2200
nspname | public
nspowner | 6171
nspacl | {pg_database_owner=UC/pg_database_owner,=U/pg_database_owner}
Важная таблица pg_class хранит описание целого ряда объектов: таблиц, представлений, индексов, последовательностей. Все эти объекты называются в PostgreSQL общим словом «отношение» (relation), отсюда и префикс «rel» в названии столбцов:
relname | relkind | relnamespace | relfilenode | relowner | relpersistence
------------------+---------+--------------+-------------+----------+----------------
employees_id_seq | S | 2200 | 16387 | 16384 | p
employees | r | 2200 | 16388 | 16384 | p
employees_pkey | i | 2200 | 16393 | 16384 | p
top_managers | v | 2200 | 0 | 16384 | p
emp_salaries | r | 16399 | 16401 | 16384 | t
(5 rows)
Тип объекта определяется столбцом relkind, по значению в relpersistence можно отличить временные объекты от постоянных.
При активном использовании временных объектов в таблицах системного каталога будет возникать большое количество неактуальных версий строк, что может привести к снижению производительности на всех этапах выполнения запроса. В таком случае следует позаботиться о своевременной очистке таблиц системного каталога.
Конечно, для каждого типа объектов в pg_class имеет смысл только часть столбцов; кроме того, удобнее смотреть не на идентификаторы (relnamespace, relowner, и т. д.), а на названия соответствующих объектов. Для этого существуют различные системные представления, например:
В psql встроен набор команд для получения информации из системного каталога. Это короткие команды, пользоваться которыми проще, чем писать запросы к системным таблицам или представлениям.
Получить список таблиц можно командой:
=>\dt
List of relations
Schema | Name | Type | Owner
-----------+--------------+-------+---------
pg_temp_4 | emp_salaries | table | student
public | employees | table | student
(2 rows)
Список всех представлений в схеме public:
=> \dv public.*
List of relations
Schema | Name | Type | Owner
--------+--------------+------+---------
public | top_managers | view | student
(1 row)
Список таблиц, представлений, индексов и последовательностей:
=> \dtvis
Page 8: Page 8
List of relations
Schema | Name | Type | Owner | Table
-----------+------------------+----------+---------+-----------
pg_temp_4 | emp_salaries | table | student |
public | employees | table | student |
public | employees_id_seq | sequence | student |
public | employees_pkey | index | student | employees
public | top_managers | view | student |
(5 rows)
Эти команды можно снабдить модификатором «+», чтобы получить больше информации:
Помимо отношений, аналогичным образом можно смотреть и на другие объекты, такие как схемы (\dn) или функции (\df).
Еще один модификатор «S» позволяет вывести не только пользовательские, но и системные объекты. С помощью шаблона можно ограничить выборку:
=> \dfS pg*size
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+------------------------+------------------+---------------------+------
pg_catalog | pg_column_size | integer | "any" | func
pg_catalog | pg_database_size | bigint | name | func
pg_catalog | pg_database_size | bigint | oid | func
pg_catalog | pg_indexes_size | bigint | regclass | func
pg_catalog | pg_relation_size | bigint | regclass | func
pg_catalog | pg_relation_size | bigint | regclass, text | func
pg_catalog | pg_table_size | bigint | regclass | func
pg_catalog | pg_tablespace_size | bigint | name | func
pg_catalog | pg_tablespace_size | bigint | oid | func
pg_catalog | pg_total_relation_size | bigint | regclass | func
(10 rows)
Page 9: Page 9
Как правило, эти команды psql имеют мнемонические имена. Например, \df — describe function, \sf — show function:
Полный список всегда можно посмотреть в документации или командой psql \?.
Изучение структуры системного каталога
Все команды psql, описывающие объекты, обращаются к таблицам системного каталога. Чтобы увидеть эти запросы, следует установить переменную psql ECHO_HIDDEN. Получим, например, информацию о таблице employees:
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+---------
public | employees | table | student
(1 row)
=> \unset ECHO_HIDDEN
Для большинства таблиц системного каталога имеются первичные ключи (обычно это столбец oid) и ограничения уникальности. Например, таблица pg_attribute с информацией об атрибутах отношений имеет ограничения:
=>\dpg_attribute
Page 10: Page 10
Table "pg_catalog.pg_attribute"
Column | Type | Collation | Nullable | Default
----------------+-----------+-----------+----------+---------
attrelid | oid | | not null |
attname | name | | not null |
atttypid | oid | | not null |
attlen | smallint | | not null |
attnum | smallint | | not null |
attcacheoff | integer | | not null |
atttypmod | integer | | not null |
attndims | smallint | | not null |
attbyval | boolean | | not null |
attalign | "char" | | not null |
attstorage | "char" | | not null |
attcompression | "char" | | not null |
attnotnull | boolean | | not null |
atthasdef | boolean | | not null |
atthasmissing | boolean | | not null |
attidentity | "char" | | not null |
attgenerated | "char" | | not null |
attisdropped | boolean | | not null |
attislocal | boolean | | not null |
attinhcount | smallint | | not null |
attstattarget | smallint | | not null |
attcollation | oid | | not null |
attacl | aclitem[] | | |
attoptions | text[] | C | |
attfdwoptions | text[] | C | |
attmissingval | anyarray | | |
Indexes:
"pg_attribute_relid_attnum_index" PRIMARY KEY, btree (attrelid, attnum)
"pg_attribute_relid_attnam_index" UNIQUE CONSTRAINT, btree (attrelid, attname)
Ссылочная целостность обеспечивается с помощью ограничений, похожих на внешние ключи, но немного более сложных: ссылающийся столбец может быть массивом ссылающихся элементов, а неопределенность может обозначаться в нем нулем. Получить список таких псевдо-внешних ключей можно функцией pg_get_catalog_foreign_keys(). Например, pg_attribute “ссылается” на:
fktable | fkcols | pktable | pkcols | is_array | is_opt
--------------+----------------+--------------+--------+----------+--------
pg_attribute | {attrelid} | pg_class | {oid} | f | f
pg_attribute | {atttypid} | pg_type | {oid} | f | t
pg_attribute | {attcollation} | pg_collation | {oid} | f | t
(3 rows)
fktable, fkcols — ссылающаяся таблица и ее столбцы; pktable, pkcols — ключ, на который ссылаются; is_array — является ли ссылающийся столбец массивом; is_opt — может ли ссылающийся столбец содержать 0.
Page 11: Специальные типы данных
Тип oid — идентификатор объекта
столбец oid обеспечивает уникальность в таблицах системного каталога
целочисленный тип данных с автоинкрементом
Типы reg*
псевдонимы oid для некоторых таблиц системного каталога
(regclass для pg_class и т. п.)
приведение текстового имени объекта к типу oid и обратно
Комментарии преподавателя
Большинство таблиц системного каталога используют в качестве первичного ключа столбец с именем oid и одноименным типом данных.
Тип oid (object identifier) представляет собой целочисленный тип данных с разрядностью 32 бита (около 4 млрд. значений) и автоинкрементом.
Существует несколько специальных типов данных (фактически псевдонимов oid), начинающихся на «reg», которые позволяют преобразовывать имена объектов в oid и обратно.
Как мы видели, описания таблиц и представлений хранятся в таблице pg_class, а описание столбцов располагаются в отдельной таблице pg_attribute. Чтобы получить список столбцов конкретной таблицы, надо соединить pg_class и pg_attribute:
You are now connected to database "data_catalog" as user "student".
=>CREATETEMPTABLEt(ninteger);
CREATETABLE
=> \dnS
List of schemas
Name | Owner
--------------------+-------------------
information_schema | postgres
pg_catalog | postgres
pg_temp_4 | postgres
pg_toast | postgres
pg_toast_temp_4 | postgres
public | pg_database_owner
(6 rows)
Временная таблица расположена в схеме pg_temp_N, где N — некоторое число. Такие схемы создаются для каждого сеанса, в котором появляются временные объекты, поэтому их может быть несколько. Имя схемы для временных объектов текущего сеанса можно получить, обратившись к системной функции:
Однако в большинстве случаев точное имя схемы знать не нужно, поскольку при необходимости к временному объекту можно обратиться, используя имя схемы pg_temp:
=>SELECT*FROMpg_temp.t;
n
---
(0 rows)
Предназначение некоторых других схем нам уже известно, а с оставшимися (pg_toast*) познакомимся позже.