Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Обзор таблиц

Андрей Аксенов

Таблица — это основной объект для хранения информации в базе данных. Таблицы Greengage DB идентичны таблицам в любой реляционной СУБД, за исключением распределения строк по различным сегментам кластера для параллельной обработки и масштабируемости. Подробнее о базовых концепциях работы с таблицами вы можете узнать в соответствующем разделе документации PostgreSQL: Table Basics.

Обзор создания таблиц

Описание таблицы

Команда CREATE TABLE создает таблицу и определяет ее структуру. При создании таблицы необходимо указать:

  • Типы данных столбцов

    Типы данных определяют, какие значения могут храниться в столбцах.

  • Ограничения таблиц и столбцов

    Ограничения позволяют задать дополнительные требования к значениям в таблице или ее столбцах.

  • Тип хранения таблицы

    СУБД Greengage поддерживает несколько моделей хранения таблиц, оптимизированных для определенных типов нагрузок, таких как OLTP или OLAP. Узнайте подробнее в статье Типы таблиц.

  • Политика распределения данных

    Распределение данных в Greengage DB обеспечивает параллельную обработку за счет размещения данных таблицы на различных сегментах кластера. Узнайте подробнее в статье Распределение данных.

  • Сжатие данных

    Сжатие данных позволяет уменьшить их объем и повысить эффективность операций ввода-вывода. Узнайте подробнее в статье Сжатие данных.

  • Стратегия партиционирования таблиц

    Партиционирование дает возможность разбить большую таблицу на небольшие части, что повышает производительность запросов и позволяет оптимизировать хранение исторических данных, размещая их в более медленном хранилище. Узнайте подробнее в статье Партиционирование: классический синтаксис.

ПРИМЕЧАНИЕ

Команда CREATE TABLE AS позволяет создать новую таблицу на основе результатов запроса.

Синтаксис CREATE TABLE

Чтобы создать пустую таблицу в текущей базе данных и определить структуру таблицы, используйте команду CREATE TABLE. Пользователь, выполняющий эту команду, становится владельцем таблицы.

Ниже описан упрощенный синтаксис команды CREATE TABLE.

CREATE [ TEMP ] TABLE <table_name>
(
    [ { <column_name> <data_type> [<column_constraint> [ ... ] ]
      | <table_constraint>
      | LIKE <source_table> [ <like_option> ... ] }
      [, ... ]
    ]
)
[ INHERITS ( <parent_table> [, ... ] ) ]
[ USING <access_method> ]
[ WITH ( <storage_table_directive> [, ... ] ) ]
[ DISTRIBUTED BY (<column_name> [<opclass>], [ ... ] )
    | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
[ PARTITION BY <partition_type> (<column_name>) <partition_specification>]

Аргументы

Основные аргументы для определения таблицы, ее столбцов и ограничений следующие:

table_name

Имя таблицы. По умолчанию, команда CREATE TABLE создает таблицу в предопределенной схеме public. Чтобы использовать другую схему, укажите ее имя в аргументе table_name или измените путь поиска схемы по умолчанию, как описано в статье Схемы.

column_name/data_type

Имя столбца и его тип данных, соответственно. Смотрите рекомендации по выбору типов данных в разделе Типы данных столбцов ниже.

column_constraint

Ограничение, определенное для указанного столбца. Смотрите раздел Установка ограничений ниже.

table_constraint

Ограничение, определенное на уровне таблицы. Смотрите раздел Установка ограничений ниже.

Выражения

Ниже приведены описания выражений, упомянутых в приведенном выше фрагменте синтаксиса CREATE TABLE:

TEMP

Создает временную таблицу, которая существует только во время сессии или до окончания текущей транзакции. Затем таблица удаляется автоматически.

LIKE <source_table> [ <like_option> …​ ]

Создает новую таблицу, копируя настройки столбцов из существующей таблицы, включая имена столбцов, типы данных и ограничения NOT NULL.

INHERITS ( <parent_table> [, …​ ] )

Создает новую таблицу, которая наследует столбцы и ограничения родительских таблиц. Все изменения, применяемые к структуре родительской таблицы, также распространяются на дочернюю.

USING <access_method>

Определяет метод доступа, который используется для хранения содержимого создаваемой таблицы.

Значение по умолчанию может быть изменено с помощью конфигурационного параметра default_table_access_method.

WITH ( <storage_table_directive> [, …​ ] )

Устанавливает параметры хранения для таблицы.

Параметр конфигурации сервера gp_default_storage_options позволяет задавать значения по умолчанию для параметров хранения таблиц.

DISTRIBUTED …​

Устанавливает политику распределения, которая определяет, как данные таблицы распределяются по сегментам в кластере Greengage DB.

PARTITION BY …​

Определяет стратегию партиционирования для таблицы.

Типы данных столбцов

Есть несколько рекомендаций по выбору типов данных для столбцов:

  • Выбирайте тип данных в соответствии с хранимой в столбце информацией.

    Например, используйте числовые типы для чисел, символьные типы — для текста, а типы date или timestamp — для дат и времени.

  • Используйте тип данных с наименьшим размером.

    Например, используйте INT вместо BIGINT или TEXT вместо CHAR(<n>).

  • Учитывайте возможный рост данных при выборе небольших числовых типов.

    Например, SMALLINT может быть достаточным на данный момент, но переход на INT в будущем потребует значительных ресурсов, если в таблице накопилось много данных. Если значения могут со временем увеличиться, лучше сразу выбрать тип с большим диапазоном.

  • Если возможно, используйте специализированные типы данных.

    Применяйте такие типы, как INET, CIDR, JSON, JSONB или MACADDR для улучшения производительности, валидации и наглядности при работе с IP-адресами, JSON-данными и т.д.

  • Используйте одинаковые типы данных для столбцов, участвующих в соединениях (JOIN).

    Если типы данных различаются, перед сравнением их необходимо преобразовывать, что может замедлить выполнение запросов.

  • Используйте собственные типы данных, когда это необходимо.

    В частности, тип ENUM подходит, если столбец должен содержать только ограниченный набор значений (например, low, medium и high). Значения типа ENUM хранятся более эффективно и обрабатываются быстрее, чем эквивалентные значения типа TEXT.

Создание таблиц

Предварительные требования

Для выполнения команд, описанных в следующих разделах, подключитесь к координатор-хосту Greengage DB с помощью psql, как описано в статье Подключение к Greengage DB с использованием psql. Затем создайте новую базу данных и подключитесь к ней:

CREATE DATABASE marketplace;
\c marketplace

Создание новой таблицы

SQL-запрос ниже создает новую таблицу customers со следующими параметрами:

  • Выражение USING ao_row используется для создания оптимизированной для добавления (Append-Optimized, AO) таблицы со строковым (row-oriented) хранением данных.

  • Выражение DISTRIBUTED BY указывает, что столбец customer_id используется в качестве ключа распределения строк таблицы по сегментам.

CREATE TABLE customers
(
    customer_id   INTEGER,
    name          TEXT,
    email         TEXT,
    customer_type TEXT
)
    USING ao_row
    DISTRIBUTED BY (customer_id);
INSERT INTO customers (customer_id, name, email, customer_type)
VALUES (1, 'Andrew Fuller', 'andrew@example.com', 'Regular'),
       (2, 'Michael Suyama', 'michael@testmail.com', 'Premium'),
       (3, 'Laura Callahan', 'laura@example.io', 'Regular'),
       (4, 'Nancy Davolio', 'nancy@samplemail.com', 'Premium'),
       (5, 'Steven Buchanan', 'steven@fastmail.net', 'Regular'),
       (6, 'Margaret Peacock', 'margaret@example.com', 'Regular');

При необходимости вы можете добавить комментарий к созданной таблице с помощью команды COMMENT:

COMMENT ON TABLE customers IS 'Customer information';

Создание таблицы с использованием выражения LIKE

Команда ниже использует выражение LIKE для создания новой таблицы stg_customers с такими же именами столбцов и типами данных, как у таблицы customers:

CREATE TABLE stg_customers
(
    LIKE customers
)
    USING ao_row
    DISTRIBUTED BY (customer_id);

Обратите внимание, что параметры хранения не копируются в новую таблицу и должны быть определены явно с помощью выражения WITH.

Создание таблицы с использованием выражения INHERITS

Чтобы создать таблицу, которая наследует все столбцы и ограничения существующей таблицы, используйте выражение INHERITS. В приведенном ниже примере новая таблица business_customers наследует таблицу customers и добавляет дополнительный столбец company:

CREATE TABLE business_customers
(
    company TEXT
)
    INHERITS (customers)
    USING ao_row
    DISTRIBUTED BY (customer_id);
INSERT INTO business_customers (customer_id, name, email, customer_type, company)
VALUES (7, 'Robert King', 'robert@demo.org', 'Business', 'King Enterprises'),
       (8, 'Janet Leverling', 'janet@businessmail.com', 'Business', 'Leverling Ltd');

Создание временной таблицы

Команда ниже создает временную таблицу из результатов SQL-запроса SELECT с помощью CREATE TABLE AS:

CREATE TEMP TABLE temp_premium_customers AS
SELECT customer_id, name, email
FROM customers
WHERE customer_type = 'Premium'
    DISTRIBUTED BY (customer_id);

Чтобы проверить, что таблица temp_premium_customers создана, используйте метакоманду \dt:

                        List of relations
   Schema    |          Name          | Type  |  Owner  | Storage
-------------+------------------------+-------+---------+---------
 pg_temp_436 | temp_premium_customers | table | gpadmin | heap
 public      | business_customers     | table | gpadmin | ao_row
 public      | customers              | table | gpadmin | ao_row
 public      | stg_customers          | table | gpadmin | ao_row
(4 rows)

Переподключитесь к базе данных, используя метакоманду \c:

\c marketplace

Временная таблица автоматически удаляется, когда сессия завершается. Чтобы проверить это, выполните \dt еще раз для отображения списка таблиц. Вывод должен подтвердить, что таблица temp_premium_customers больше не существует:

                    List of relations
 Schema |        Name        | Type  |  Owner  | Storage
--------+--------------------+-------+---------+---------
 public | business_customers | table | gpadmin | ao_row
 public | customers          | table | gpadmin | ao_row
 public | stg_customers      | table | gpadmin | ao_row
(3 rows)

Чтобы узнать больше о том, как просматривать информацию о таблицах, смотрите раздел Просмотр информации о таблицах ниже.

Установка ограничений

Ограничения уникальности

Следующий SQL-запрос создает таблицу orders с ограничением уникальности для столбца order_id с помощью выражения UNIQUE:

CREATE TABLE orders
(
    order_id    INTEGER UNIQUE,
    customer_id INTEGER,
    product_id  INTEGER,
    price       NUMERIC(6, 2)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

Каждое значение в столбце order_id должно быть уникальным — повторяющиеся значения не допускаются. Например, следующий запрос INSERT нарушает указанное ограничение уникальности:

INSERT INTO orders (order_id, customer_id, product_id, price)
VALUES (1, 1, 11, 99.9),
       (1, 2, 35, 25.5);

В этом случае должна возникнуть следующая ошибка:

duplicate key value violates unique constraint "orders_order_id_key"
ВАЖНО

Обратите внимание на следующее при использовании ограничения уникальности, а также ограничения первичного ключа:

  • При задании ограничения уникальности неявно создается уникальный индекс.

  • Ограничение уникальности должно включать все столбцы ключа распределения, а также столбцы ключа партиционирования (если он задан).

Ограничения NOT NULL

Команда ниже создает таблицу orders с ограничением NOT NULL для столбца order_id:

CREATE TABLE orders
(
    order_id    INTEGER NOT NULL,
    customer_id INTEGER,
    product_id  INTEGER,
    price       NUMERIC(6, 2)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

Столбец order_id не должен содержать значение NULL. Например, следующий запрос INSERT нарушает заданное ограничение:

INSERT INTO orders (order_id, customer_id, product_id, price)
VALUES (1, 1, 11, 99.9),
       (NULL, 2, 35, 25.5);

Должна возникнуть следующая ошибка:

null value in column "order_id" violates not-null constraint

Первичные ключи

Ограничение первичного ключа представляет собой сочетание ограничений уникальности и NOT NULL. Указание первичного ключа накладывает ограничения на то, как может быть определена политика распределения таблицы:

  • Таблица должна использовать хеш-распределение.

  • Столбцы первичного ключа должны совпадать со столбцами ключа распределения таблицы.

Если у таблицы задан первичный ключ, соответствующий столбец по умолчанию используется в качестве ключа распределения.

Команда ниже создает таблицу orders с ограничением первичного ключа для столбца order_id:

CREATE TABLE orders
(
    order_id    INTEGER PRIMARY KEY,
    customer_id INTEGER,
    product_id  INTEGER,
    price       NUMERIC(6, 2)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

Например, следующий запрос INSERT нарушает указанное ограничение:

INSERT INTO orders (order_id, customer_id, product_id, price)
VALUES (1, 1, 11, 99.9),
       (1, 2, 35, 25.5);

Должна возникнуть следующая ошибка:

duplicate key value violates unique constraint "orders_pkey"

Ограничения-проверки

Ограничение-проверка позволяет указать, что значения в одном или нескольких столбцах должны удовлетворять логическому выражению (проверке истинности).

Ограничения столбцов

В приведенном ниже примере цена товара ограничена положительными значениями:

CREATE TABLE orders
(
    order_id    INTEGER,
    customer_id INTEGER,
    product_id  INTEGER,
    price       NUMERIC(6, 2) CHECK (price >= 0)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

Например, следующий запрос INSERT нарушает указанное ограничение:

INSERT INTO orders (order_id, customer_id, product_id, price)
VALUES (1, 1, 11, -10);

Должна быть вызвана следующая ошибка:

new row for relation "orders" violates check constraint "orders_price_check"

Ограничения таблицы

В примере ниже установлено ограничение-проверка на уровне таблицы для столбцов price и count:

CREATE TABLE orders
(
    order_id    INTEGER,
    customer_id INTEGER,
    product_id  INTEGER,
    price       NUMERIC(6, 2),
    count       INTEGER,
    CHECK (price > 0 AND count >= 1)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

Следующий запрос INSERT нарушает указанное ограничение:

INSERT INTO orders (order_id, customer_id, product_id, price, count)
VALUES (1, 1, 11, -25.5, 0);

Этот запрос должен вызвать следующую ошибку:

new row for relation "orders" violates check constraint "orders_check"

Внешние ключи

ВАЖНО

Ограничения внешнего ключа не поддерживаются. Вы можете их объявить, но контроль ссылочной целостности между сегментами распределенной таблицы невозможен.

В этом примере создается таблица products и таблица orders с внешним ключом, ссылающимся на products:

CREATE TABLE products
(
    product_id INTEGER PRIMARY KEY,
    name       TEXT
)
    DISTRIBUTED REPLICATED;

CREATE TABLE orders
(
    order_id   INTEGER,
    product_id INTEGER REFERENCES products (product_id),
    price      NUMERIC(6, 2)
)
    USING ao_row
    DISTRIBUTED BY (order_id);

При создании таблицы orders должно отображаться следующее предупреждение:

referential integrity (FOREIGN KEY) constraints are not supported in Greengage Database, will not be enforced

Эти запросы вставляют допустимые строки в таблицу products и строку с несуществующим product_id в таблицу orders:

INSERT INTO products (product_id, name)
VALUES (1, 'Chai'),
       (2, 'Chang');

INSERT INTO orders (order_id, product_id, price)
VALUES (1, 3, 19.99);

При вставке данных не должно возникнуть ошибок или предупреждений.

Ограничения-исключения

Ограничения-исключения гарантируют, что для любых двух строк таблицы по крайней мере одно сравнение по указанным столбцам или выражениям при использовании заданных операторов возвращает FALSE или NULL. Они обычно используются для предотвращения перекрытия значений, например, временных диапазонов или геометрических областей.

В примере ниже ограничение-исключение для столбца discount_period предотвращает пересечение периодов действия скидок для всех продуктов:

CREATE TABLE product_discounts
(
    product_id      INTEGER,
    discount_period TSRANGE,

    EXCLUDE USING gist (discount_period WITH &&)
)
    DISTRIBUTED REPLICATED;

Например, приведенный ниже запрос INSERT нарушает указанное ограничение-исключение, так как периоды скидок пересекаются:

INSERT INTO product_discounts (product_id, discount_period)
VALUES (1001, '[2026-01-01, 2026-01-10)'),
       (1002, '[2026-01-05, 2026-01-15)');

Этот запрос вызывает следующую ошибку:

conflicting key value violates exclusion constraint "product_discounts_discount_period_excl"

Добавление ограничения-исключения автоматически создает индекс типа, указанного в определении ограничения. В этом примере индекс называется product_discounts_discount_period_excl.

Как и ограничение уникальности, ограничение-исключение допускается только для реплицированных таблиц или когда столбцы ключа распределения включены в ограничение с тем же оператором =, который определен в классе хеш-оператора ключа распределения.

Ограничения-исключения не поддерживаются для партиционированных таблиц.

Изменение таблиц

Чтобы изменить таблицу, используйте команду ALTER TABLE. SQL-запрос ниже добавляет новый столбец signup_date в таблицу customers:

ALTER TABLE customers
    ADD COLUMN signup_date DATE;

Вы можете использовать метакоманду \d customers, чтобы проверить, что столбец добавлен:

                 Table "public.customers"
    Column     |  Type   | Collation | Nullable | Default
---------------+---------+-----------+----------+---------
 customer_id   | integer |           |          |
 name          | text    |           |          |
 email         | text    |           |          |
 customer_type | text    |           |          |
 signup_date   | date    |           |          |
Number of child tables: 1 (Use \d+ to list them.)
Distributed by: (customer_id)

Обратите внимание, что таблицы, созданные с использованием выражения INHERITS, наследуют все столбцы родительских таблиц. Например, при выполнении команды \d business_customers видно, что таблица содержит столбец signup_date, унаследованный от родительской таблицы customers:

            Table "public.business_customers"
    Column     |  Type   | Collation | Nullable | Default
---------------+---------+-----------+----------+---------
 customer_id   | integer |           |          |
 name          | text    |           |          |
 email         | text    |           |          |
 customer_type | text    |           |          |
 company       | text    |           |          |
 signup_date   | date    |           |          |
Inherits: customers
Distributed by: (customer_id)
ВАЖНО

Некоторые команды ALTER TABLE (например, ALTER COLUMN TYPE) требуют полной перезаписи таблицы и устанавливают на нее блокировку. Это блокирует доступ к таблице, включая операции чтения, до завершения выполнения команды. Для больших таблиц такие команды лучше выполнять во время планового обслуживания, чтобы избежать перерыва в сервисе.

Для очень больших таблиц, которые требуют перезаписи, эффективнее создать копию таблицы, вставить в нее данные, а затем переименовать ее. Это позволяет избежать блокировки исходной таблицы и внести изменения без прерывания доступа к ней.

Просмотр информации о таблицах

Просмотр списка таблиц

Метакоманды psql

  • Чтобы вывести список таблиц, используйте метакоманду \dt:

    \dt

    Вывод включает различную информацию, включая схему, к которой принадлежит каждая таблица, имя таблицы, ее тип, владельца и модель хранения:

                        List of relations
     Schema |        Name        | Type  |  Owner  | Storage
    --------+--------------------+-------+---------+---------
     public | business_customers | table | gpadmin | ao_row
     public | customers          | table | gpadmin | ao_row
     public | stg_customers      | table | gpadmin | ao_row
    (3 rows)
  • Метакоманда \dt+ возвращает дополнительные поля:

    \dt+

    Вывод включает размер и описание таблицы:

                                        List of relations
     Schema |        Name        | Type  |  Owner  | Storage |  Size  |     Description
    --------+--------------------+-------+---------+---------+--------+----------------------
     public | business_customers | table | gpadmin | ao_row  | 352 kB |
     public | customers          | table | gpadmin | ao_row  | 448 kB | Customer information
     public | stg_customers      | table | gpadmin | ao_row  | 320 kB |
    (3 rows)
  • Чтобы отобразить системные таблицы, используйте метакоманду \dtS:

    \dtS

    Вывод должен включать таблицы из схемы системного каталога pg_catalog:

                             List of relations
       Schema   |           Name           | Type  |  Owner  | Storage
    ------------+--------------------------+-------+---------+---------
     pg_catalog | gp_configuration_history | table | gpadmin | heap
     pg_catalog | gp_distribution_policy   | table | gpadmin | heap
     pg_catalog | gp_fastsequence          | table | gpadmin | heap
     pg_catalog | gp_id                    | table | gpadmin | heap
     pg_catalog | gp_partition_template    | table | gpadmin | heap
     pg_catalog | gp_segment_configuration | table | gpadmin | heap
     pg_catalog | gp_version_at_initdb     | table | gpadmin | heap
     pg_catalog | pg_aggregate             | table | gpadmin | heap
     pg_catalog | pg_am                    | table | gpadmin | heap
     pg_catalog | pg_amop                  | table | gpadmin | heap
     ...
  • Для поиска таблиц в конкретной схеме можно использовать регулярные выражения. Например, следующая команда возвращает все таблицы в схеме information_schema:

    \dt information_schema.*

    Результат должен выглядеть следующим образом:

                                List of relations
           Schema       |          Name           | Type  |  Owner  | Storage
    --------------------+-------------------------+-------+---------+---------
     information_schema | sql_features            | table | gpadmin | heap
     information_schema | sql_implementation_info | table | gpadmin | heap
     information_schema | sql_languages           | table | gpadmin | heap
     information_schema | sql_packages            | table | gpadmin | heap
     information_schema | sql_parts               | table | gpadmin | heap
     information_schema | sql_sizing              | table | gpadmin | heap
     information_schema | sql_sizing_profiles     | table | gpadmin | heap
    (7 rows)
  • Чтобы отобразить привилегии доступа к объектам базы данных, включая таблицы, используйте метакоманду \dp:

    \dp

    Результат должен выглядеть так:

                                       Access privileges
     Schema |        Name        | Type  | Access privileges | Column privileges | Policies
    --------+--------------------+-------+-------------------+-------------------+----------
     public | business_customers | table |                   |                   |
     public | customers          | table |                   |                   |
     public | stg_customers      | table |                   |                   |
    (3 rows)

    Столбец Access privileges для новых таблиц пуст, что означает, что привилегии не настроены. Смотрите раздел Роли и привилегии, чтобы узнать, как предоставить пользователям доступ к этим таблицам.

Системные каталоги

  • Выполните SQL-запрос к системному представлению pg_catalog.pg_tables:

    SELECT *
    FROM pg_catalog.pg_tables
    WHERE schemaname = 'public'
    ORDER BY schemaname, tablename;

    Вывод содержит информацию о таблицах, включая их схему, имя, владельца, а также связанные характеристики: наличие индексов, правил и триггеров:

     schemaname |     tablename      | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
    ------------+--------------------+------------+------------+------------+----------+-------------+-------------
     public     | business_customers | gpadmin    |            | f          | f        | f           | f
     public     | customers          | gpadmin    |            | f          | f        | f           | f
     public     | stg_customers      | gpadmin    |            | f          | f        | f           | f
    (3 rows)
  • Выполните SQL-запрос к таблице information_schema.tables. Используйте table_type = 'BASE TABLE' в выражении WHERE, чтобы вывести только таблицы:

    SELECT table_catalog, table_schema, table_name, table_type
    FROM information_schema.tables
    WHERE table_type = 'BASE TABLE'
      AND table_schema = 'public'
    ORDER BY table_schema, table_name;

    Результат выглядит следующим образом:

     table_catalog | table_schema |     table_name     | table_type
    ---------------+--------------+--------------------+------------
     marketplace   | public       | business_customers | BASE TABLE
     marketplace   | public       | customers          | BASE TABLE
     marketplace   | public       | stg_customers      | BASE TABLE
    (3 rows)

Просмотр информации о таблице

  • Для просмотра структуры указанной таблицы используйте метакоманду \d:

    \d customers

    Вывод содержит информацию о столбцах таблицы, типах данных и других настройках таблицы:

                     Table "public.customers"
        Column     |  Type   | Collation | Nullable | Default
    ---------------+---------+-----------+----------+---------
     customer_id   | integer |           |          |
     name          | text    |           |          |
     email         | text    |           |          |
     customer_type | text    |           |          |
     signup_date   | date    |           |          |
    Number of child tables: 1 (Use \d+ to list them.)
    Distributed by: (customer_id)
  • Метакоманда \d+ возвращает дополнительную информацию:

    \d+ customers

    Вывод может включать параметры хранения, такие как тип и уровень сжатия, дочерние таблицы, созданные с использованием выражения INHERITS, и так далее:

                                         Table "public.customers"
        Column     |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
    ---------------+---------+-----------+----------+---------+----------+--------------+-------------
     customer_id   | integer |           |          |         | plain    |              |
     name          | text    |           |          |         | extended |              |
     email         | text    |           |          |         | extended |              |
     customer_type | text    |           |          |         | extended |              |
     signup_date   | date    |           |          |         | plain    |              |
    Child tables: business_customers
    Distributed by: (customer_id)
    Access method: ao_row
    Options: blocksize=32768, compresslevel=0, compresstype=none, checksum=true

Полезные SQL-запросы

  • Следующий SQL-запрос возвращает число отношений (relation) базы данных, сгруппированных по их типу:

    SELECT relkind, COUNT(*)
    FROM pg_catalog.pg_class
    GROUP BY(relkind)
    ORDER BY COUNT(*);

    Результат выглядит следующим образом:

     relkind | count
    ---------+-------
     f       |     3
     M       |     3
     o       |     3
     c       |     7
     t       |    50
     r       |    94
     i       |   201
     v       |   288
    (8 rows)

    Например, r — это heap-таблица или таблица, оптимизированная для добавления (Append-Optimized, AO), i — индекс, v — представление.

  • Команда ниже позволяет получить информацию об отношении (relation) по его имени:

    SELECT relation.oid,
           relation.relname,
           schema.nspname,
           tablespace.spcname,
           relation.relpersistence,
           relation.relkind,
           relation.relpages,
           relation.reltuples
    FROM pg_catalog.pg_class relation
             LEFT JOIN pg_catalog.pg_namespace schema ON schema.oid = relation.relnamespace
             LEFT JOIN pg_catalog.pg_tablespace tablespace ON tablespace.oid = relation.reltablespace
    WHERE relation.relname = 'customers';

    Результат выглядит следующим образом:

      oid  |  relname  | nspname | spcname | relpersistence | relkind | relpages | reltuples
    -------+-----------+---------+---------+----------------+---------+----------+-----------
     25626 | customers | public  |         | p              | r       |        1 |         6
    (1 row)
  • Команда ниже отображает список TOAST-таблиц вместе с основными таблицами, с которыми они связаны:

    SELECT toast_table.oid     AS "TOAST OID",
           toast_table.relname AS "TOAST name",
           main_table.oid      AS "Main OID",
           main_table.relname  AS "Main name"
    FROM pg_catalog.pg_class toast_table
             LEFT JOIN pg_catalog.pg_class main_table
                       ON toast_table.oid = main_table.reltoastrelid
    WHERE main_table.relname LIKE '%customers%'
    ORDER BY main_table.relname;

    Вывод должен выглядеть так:

     TOAST OID |   TOAST name   | Main OID |     Main name
    -----------+----------------+----------+--------------------
         25645 | pg_toast_25640 |    25640 | business_customers
         25631 | pg_toast_25626 |    25626 | customers
         25638 | pg_toast_25633 |    25633 | stg_customers
    (3 rows)

Удаление таблиц

Чтобы удалить таблицу, используйте команду DROP TABLE:

DROP TABLE stg_customers;

Чтобы удалить таблицу и связанные с ней объекты, такие как представления или унаследованные таблицы, используйте параметр CASCADE:

DROP TABLE customers CASCADE;

Таблицы системного каталога

Greengage DB предоставляет набор предопределенных системных каталогов в схеме pg_catalog. Некоторые из этих таблиц могут быть полезны для мониторинга кластера и других задач администратора базы данных. Примеры таких таблиц:

  • gp_segment_configuration — содержит информацию о конфигурации кластера: статусе координаторов, сегментов и их зеркал.

  • gp_distribution_policy — включает информацию о таблицах и политике распределения данных по сегментам.

  • gp_configuration_history — содержит информацию об изменениях в системе, связанных с обнаружением сбоев и восстановлением после них.