Пример работы с таблицами ADB через psql

Обзор

В статье описаны основные операции с таблицами, доступные в ADB. Синтаксис SQL в ADB совпадает с синтаксисом Greengage DB — СУБД, на которой ADB основана начиная с версии 6.29. Greengage DB, в свою очередь, наследует синтаксис SQL от PostgreSQL и дополняет его новыми возможностями, связанными с распределенной архитектурой. Полный список команд с описанием их параметров можно найти в документации Greengage DB.

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

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

Подключение к базе данных по умолчанию

Если вы не создавали баз данных в ADB, можно использовать базу данных по умолчанию — adb.

  1. Подключитесь к хосту мастера ADB (например, по SSH) и войдите в систему под учетной записью gpadmin, которая создается по умолчанию:

    $ sudo su - gpadmin
  2. Подключитесь к базе данных adb:

    $ psql adb

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

psql (9.4.26)
Type "help" for help.

adb=#

Для выхода из psql используйте следующую команду:

\q

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

Шаг 1. Создание базы данных

Для создания новой базы данных используйте команду CREATE DATABASE, введите имя базы данных и завершите команду точкой с запятой ;.

Следующий пример создает новую базу данных с именем universe:

CREATE DATABASE universe;

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

CREATE DATABASE

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

\c universe

Результат:

You are now connected to database "universe" as user "gpadmin".
universe=#
РЕКОМЕНДАЦИЯ

Для мониторинга сессий, транзакций и SQL-команд ADB можно использовать ADB Control.

Чтобы новая база данных учитывалась в мониторинге ADB Control, укажите ее в разделе Databases monitoring в веб-интерфейсе ADB Control.

Шаг 2. Создание таблицы

Для создания новой таблицы используйте команду CREATE TABLE, укажите имя таблицы, опишите все столбцы таблицы (указав их имена и типы данных) и завершите команду точкой с запятой ;.

Кроме того, в отличие от стандартного синтаксиса PostgreSQL, каждая таблица в ADB имеет политику распределения (distribution policy), которая определяет, как строки распределяются между узлами сегментов.

Если при создании таблицы не указано выражение DISTRIBUTED BY, конфигурационный параметр сервера gp_create_table_random_default_distribution определяет способ распределения таблиц по умолчанию.

Для демонстрации поведения по умолчанию следующая команда создает таблицу missions без указания политики распределения:

CREATE TABLE missions (
    planet_id    INTEGER,
    planet_name  TEXT,
    program_name TEXT,
    launch_year  INTEGER
);

Результат:

NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'planet_id' as the Greengage Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE

Поскольку выражение DISTRIBUTED BY не указано, ADB использует первый столбец, к которому можно применить хеш-функцию, — в нашем случае planet_id. Распределение таблицы по столбцу planet_id означает, что при добавлении или обновлении строки база данных применяет хеш-функцию к значению planet_id этой строки, и полученный хеш определяет, какой сегмент будет хранить данную строку.

Следующая команда создает таблицу, в которой первый столбец не является хешируемым:

CREATE TABLE planet_locations (
    coord      POINT,
    planet_id  INT,
    name       TEXT
);

Поскольку тип POINT не является хешируемым, ADB автоматически пропускает первый столбец и в качестве ключа распределения выбирает следующий подходящий столбец (в данном примере — planet_id типа INT):

NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'planet_id' as the Greengage Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE

Автоматический выбор ключа распределения может подойти, но рекомендуется явно указывать ключ распределения с помощью DISTRIBUTED BY. Продуманная политика распределения поможет избежать перекоса данных на сегментах и неоптимальных планов выполнения запросов.

Следующая команда создает таблицу с ключом распределения, явно заданным в выражении DISTRIBUTED BY:

CREATE TABLE moons (
    planet_id      INT,
    moon_id        INT,
    moon_name      TEXT,
    diameter_km    NUMERIC,
    coord          POINT
)
    DISTRIBUTED BY (moon_id);

Результат:

CREATE TABLE

Подробнее о распределении данных см. в статье Распределение данных.

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

По умолчанию, если тип таблицы не указан, ADB создает heap-таблицу. Конфигурационный параметр сервера gp_default_storage_options управляет поведением по умолчанию в этом случае.

Heap-таблицы используются для OLTP-нагрузки, когда данные часто меняются. Например, если вы часто обновляете координаты планет в таблице planet_locations (созданной выше), heap-таблицы эффективно обрабатывают такие обновления.

Для аналитических нагрузок с массовой загрузкой данных и нечастыми обновлениями ADB поддерживает append-optimized (AO) таблицы с опциональным колоночным хранением и сжатием.

Подробнее о heap и append-optimized таблицах см. в статье Типы таблиц.

Для создания append-optimized таблицы передайте параметр хранения appendoptimized = true в выражении WITH.

CREATE TABLE planets (
    planet_id     INT,
    name          TEXT,
    type          TEXT,
    mass_kg       NUMERIC,
    diameter_km   NUMERIC,
    distance_au   NUMERIC,
    orbit_days    NUMERIC
) WITH (
    appendoptimized = true
);

В отличие от heap-таблиц, которые имеют только строковую форму хранения данных (row-oriented), append-optimized таблицы могут быть строковыми или колоночными (column-oriented). Если ориентация не указана (как в примере выше), по умолчанию создается строковая таблица. Используйте строковую ориентацию, если ожидается небольшое количество строк, а запросы часто извлекают большинство столбцов.

Если ожидается большое количество строк, а один запрос затрагивает небольшое подмножество столбцов, используйте колоночную ориентацию, указав orientation = column.

Следующая команда создает append-optimized таблицу с колоночным хранением:

CREATE TABLE stars (
    star_id          BIGINT,
    designation      TEXT,
    distance         NUMERIC,
    temperature_k    INTEGER,
    luminosity_sun   NUMERIC,
    radius_sun       NUMERIC
) WITH (
    appendoptimized = true,
    orientation = column
)
DISTRIBUTED BY (star_id);

Создание партиционированных таблиц

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

Обратите внимание: то, является ли таблица партиционированной, определяется при ее создании. Добавлять партиции к таблице (с помощью команды ALTER TABLE) можно только в том случае, если она была определена как партиционированная.

Для создания партиционированной таблицы используйте выражение PARTITION BY <partition_type>, где значение <partition_type> может быть LIST (партиции основаны на списке значений) или RANGE (партиции основаны на числовом диапазоне или диапазоне дат).

Следующая команда создает таблицу missions_partitioned с партициями на основе диапазона лет:

CREATE TABLE missions_partitioned (
    mission_id   INTEGER,
    planet_id    INTEGER,
    planet_name  TEXT,
    program_name TEXT,
    launch_year  INTEGER
) DISTRIBUTED BY (planet_id)
    PARTITION BY RANGE (launch_year)
        (
        PARTITION p2020_2029 START (2020) END (2030),
        PARTITION p2030_2039 START (2030) END (2040),
        PARTITION p2040_plus START (2040) END (9999)
        );

В выводе будет показано создание каждой физической таблицы-партиции:

NOTICE:  CREATE TABLE will create partition "missions_partitioned_1_prt_p2020_2029" for table "missions_partitioned"
NOTICE:  CREATE TABLE will create partition "missions_partitioned_1_prt_p2030_2039" for table "missions_partitioned"
NOTICE:  CREATE TABLE will create partition "missions_partitioned_1_prt_p2040_plus" for table "missions_partitioned"

Шаг 3. Получение информации о таблицах

Для вывода списка всех таблиц в базе данных используйте метакоманду \dt.

С ее помощью, например, можно проверить типы хранения таблиц:

                         List of relations
 Schema |       Name       | Type  |  Owner  |       Storage
--------+------------------+-------+---------+----------------------
 public | planet_locations | table | gpadmin | heap
 public | missions         | table | gpadmin | heap
 public | moons            | table | gpadmin | heap
 public | planets          | table | gpadmin | append only
 public | stars            | table | gpadmin | append only columnar

Также обратите внимание, что поскольку имя схемы не было указано при создании таблиц, все они принадлежат текущей схеме (public). Подробнее о схемах см. в статье Схемы.

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

\d planets

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

Append-Only Table "public.planets"
   Column    |  Type   | Modifiers
-------------+---------+-----------
 planet_id   | integer |
 name        | text    |
 type        | text    |
 mass_kg     | numeric |
 diameter_km | numeric |
 distance_au | numeric |
 orbit_days  | numeric |
Compression Type: None
Compression Level: 0
Block Size: 32768
Checksum: t
Distributed by: (planet_id)

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

\d+ planets

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

                                   Append-Only Table "public.planets"
   Column    |  Type   | Modifiers | Storage  | Stats target |               Description
-------------+---------+-----------+----------+--------------+------------------------------------------
 planet_id   | integer |           | plain    |              |
 name        | text    |           | extended |              | Planet name (e.g., "Mars" or "Tatooine")
 type        | text    |           | extended |              |
 mass_kg     | numeric |           | main     |              |
 diameter_km | numeric |           | main     |              |
 distance_au | numeric |           | main     |              |
 orbit_days  | numeric |           | main     |              |
Compression Type: None
Compression Level: 0
Block Size: 32768
Checksum: t
Distributed by: (planet_id)
Options: appendonly=true, orientation=row

Шаг 4. Вставка данных в таблицу

Для добавления новых данных в таблицу используйте команду INSERT INTO, укажите имя таблицы и имена столбцов, определите значения столбцов после ключевого слова VALUES и завершите команду точкой с запятой ;. Значения должны быть указаны в том же порядке, что и имена столбцов.

Следующий пример показывает, как вставить шесть новых строк в таблицу planets:

INSERT INTO planets (planet_id, name, type, mass_kg, diameter_km, distance_au, orbit_days)
VALUES
  (1, 'Mercury', 'Terrestrial', 3.3011e23, 4879, 0.387, 88.0),
  (2, 'Venus',   'Terrestrial', 4.8675e24, 12104, 0.723, 224.7),
  (3, 'Earth',   'Terrestrial', 5.9722e24, 12742, 1.000, 365.25),
  (4, 'Mars',    'Terrestrial', 6.4171e23, 6779, 1.524, 687.0),
  (5, 'Jupiter', 'Gas giant', 1.8982e27, 139820, 5.203, 4331),
  (6, 'Tatooine', 'Desert', 4.5722e24, 10465, 1.800, 525.0);

Результат:

INSERT 0 6

В этом выводе 6 — это количество добавленных строк, а 0 означает, что строкам не был присвоен идентификатор объекта (OID), так как по умолчанию OID отключены в ADB (их использование не рекомендуется для пользовательских таблиц).

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

INSERT INTO missions VALUES
    (4, 'Mars', 'Ares Horizon', 2033),
    (5, 'Jupiter', 'Ganymede Orbiter', 2037);

Шаг 5. Чтение данных

Для чтения данных из таблицы используйте команду SELECT, затем укажите имена столбцов, напишите имя таблицы после ключевого слова FROM, опишите условия запроса в выражении WHERE и завершите команду точкой с запятой ;.

Выборка всех данных

Для получения всех столбцов используйте * вместо имен столбцов:

SELECT * FROM planets;

Следующая команда делает то же, что и команда выше (но не может быть объединена с выражением WHERE):

TABLE planets;

Выборка определенных столбцов

Для получения определенных столбцов укажите их имена после SELECT.

В следующем примере используется системный столбец gp_segment_id (доступен во всех таблицах, кроме созданных с DISTRIBUTED REPLICATED) для определения того, какой сегмент хранит каждую строку:

SELECT gp_segment_id, planet_id, name
FROM planets
ORDER BY planet_id;

В выводе столбец gp_segment_id идентифицирует сегменты:

 gp_segment_id | planet_id |   name
---------------+-----------+----------
             4 |         1 | Mercury
             9 |         2 | Venus
             7 |         3 | Earth
            14 |         4 | Mars
             2 |         5 | Jupiter
             6 |         6 | Tatooine
(6 rows)

Фильтрация данных

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

Например, можно использовать оператор равенства (=) для поиска по конкретному значению:

SELECT * FROM planets
WHERE type = 'Gas giant';

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

 planet_id |  name   |   type    |           mass_kg            | diameter_km | distance_au | orbit_days
-----------+---------+-----------+------------------------------+-------------+-------------+------------
         5 | Jupiter | Gas giant | 1898200000000000000000000000 |      139820 |       5.203 |       4331
(1 row)

Также можно использовать операторы сравнения < и > с числовыми значениями, например:

SELECT name, diameter_km
FROM planets
WHERE diameter_km < 1e4;

Вывод содержит только планеты с диаметром менее 10000 километров:

  name   | diameter_km
---------+-------------
 Mars    |        6779
 Mercury |        4879
(2 rows)

В WHERE также могут использоваться математические и строковые функции и операторы. Для объединения условий используйте логические операторы AND или OR. Следующая команда показывает, как таблицы распределены по файлам данных на хостах. Она получает данные из таблицы db_files_current из схемы arenadata_toolkit, предоставляемой ADB:

SELECT content, address, table_name, file_size, file
FROM arenadata_toolkit.db_files_current
WHERE table_schema = 'public'
  AND table_name IN ('planets', 'stars', 'planet_locations')
  AND file_size != 0;

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

 content |   address   | table_name | file_size |                   file
---------+-------------+------------+-----------+-------------------------------------------
       2 | val-6-sdw-1 | planets    |        88 | /data1/primary/gpseg2/base/67705/58277.1
       4 | val-6-sdw-2 | planets    |        88 | /data1/primary/gpseg4/base/67705/58277.1
       6 | val-6-sdw-2 | planets    |        88 | /data1/primary/gpseg6/base/67705/58277.1
       7 | val-6-sdw-2 | planets    |        88 | /data1/primary/gpseg7/base/67705/58277.1
       9 | val-6-sdw-3 | planets    |        88 | /data1/primary/gpseg9/base/67705/66449.1
      14 | val-6-sdw-4 | planets    |        88 | /data1/primary/gpseg14/base/67705/66449.1
(6 rows)

Дополнительные примеры использования команды SELECT см. в документации Greengage DB.

Объединение данных из разных таблиц

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

Следующая команда объединяет данные из таблицы missions с таблицей planets, чтобы показать планеты, для которых существуют миссии:

SELECT p.name,
       (m.program_name IS NOT NULL) AS has_mission
FROM planets p
         LEFT JOIN missions m ON p.planet_id = m.planet_id;

Вывод показывает t (true) для планет, у которых есть миссии, и f (false) для планет, у которых их нет:

   name   | has_mission
----------+-------------
 Tatooine | f
 Mars     | t
 Jupiter  | t
 Venus    | f
 Earth    | f
 Mercury  | f
(6 rows)

В приведенном примере запрос с LEFT JOIN возвращает все строки из левой таблицы (planets), даже если в правой таблице (missions) нет совпадений.

В отличие от него, запрос с [INNER] JOIN возвращает только строки с совпадающими значениями — то есть только те планеты, у которых есть миссии:

SELECT p.name
FROM planets p
    JOIN missions m ON p.planet_id = m.planet_id;

Результат:

  name
---------
 Jupiter
 Mars
(2 rows)

Подробнее о типах JOIN см. в документации Greengage DB.

Группировка результатов

Для группировки строк с одинаковыми значениями в указанных столбцах используйте выражение GROUP BY. Обычно оно используется вместе с агрегатными функциями, такими как COUNT() или SUM().

Приведенная ниже команда возвращает количество планет каждого типа:

SELECT type, COUNT(*) AS planet_count
FROM planets
GROUP BY type;

Результат:

    type     | planet_count
-------------+--------------
 Desert      |            1
 Gas giant   |            1
 Terrestrial |            4
(3 rows)

Сортировка результатов

Если сортировка не используется, порядок строк, возвращаемых одним и тем же запросом, может различаться между выполнениями. Чтобы порядок строк в выводе был предсказуемым, используйте выражение ORDER BY.

Следующий запрос сортирует группы по типу планеты в порядке убывания количества строк в группе:

SELECT type, COUNT(*) AS planet_count
FROM planets
GROUP BY type
ORDER BY planet_count DESC;

Результат:

    type     | planet_count
-------------+--------------
 Terrestrial |            4
 Gas giant   |            1
 Desert      |            1
(3 rows)

Шаг 6. Анализ запросов

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

В выводе команды обратите внимание на узлы перемещения (motion nodes):

  • Broadcast Motion — каждый сегмент отправляет копию таблицы всем сегментам.

  • Redistribute Motion — каждый сегмент отправляет каждую строку одному целевому сегменту.

  • Gather Motion — мастер собирает строки с сегментов (обычно это заключительный этап).

Следующий запрос анализирует выполнение команды SELECT с соединением (JOIN) по planet_id из обеих таблиц:

EXPLAIN
SELECT p.name,
       (m.program_name IS NOT NULL) AS has_mission
FROM planets p
         LEFT JOIN missions m ON p.planet_id = m.planet_id;

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

                                     QUERY PLAN
-------------------------------------------------------------------------------------
 Gather Motion 16:1  (slice1; segments: 16)  (cost=0.00..862.00 rows=10 width=9)
   ->  Result  (cost=0.00..862.00 rows=1 width=9)
         ->  Hash Left Join  (cost=0.00..862.00 rows=1 width=23)
               Hash Cond: (p.planet_id = m.planet_id)
               ->  Seq Scan on planets p  (cost=0.00..431.00 rows=1 width=11)
               ->  Hash  (cost=431.00..431.00 rows=1 width=20)
                     ->  Seq Scan on missions m  (cost=0.00..431.00 rows=1 width=20)
 Optimizer: Pivotal Optimizer (GPORCA)
(8 rows)

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

Следующий запрос анализирует команду SELECT с соединением (JOIN) по name из обеих таблиц:

EXPLAIN
SELECT p.name,
       (m.program_name IS NOT NULL) AS has_mission
FROM planets p
         LEFT JOIN missions m ON p.name = m.planet_name;

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

                                                 QUERY PLAN
-------------------------------------------------------------------------------------------------------------
 Gather Motion 16:1  (slice2; segments: 16)  (cost=0.00..862.00 rows=10 width=9)
   ->  Result  (cost=0.00..862.00 rows=1 width=9)
         ->  Hash Left Join  (cost=0.00..862.00 rows=1 width=23)
               Hash Cond: (p.name = m.planet_name)
               ->  Seq Scan on planets p  (cost=0.00..431.00 rows=1 width=7)
               ->  Hash  (cost=431.00..431.00 rows=3 width=22)
                     ->  Broadcast Motion 16:16  (slice1; segments: 16)  (cost=0.00..431.00 rows=3 width=22)
                           ->  Seq Scan on missions m  (cost=0.00..431.00 rows=1 width=22)
 Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)

Поскольку ключ распределения — planet_id, а не name, то строки с одинаковым значением name могут находиться на разных сегментах. Чтобы каждый сегмент имел все необходимые строки для выполнения соединения по name, применяется операция Broadcast Motion: каждый сегмент отправляет свои строки всем остальным сегментам. Для больших таблиц в production-среде лишнее перемещение данных может быть дорогостоящим, поэтому выбор правильного ключа распределения важен для производительности запросов.

РЕКОМЕНДАЦИЯ

Если вы используете ADB Control, можно воспользоваться страницей Monitoring для просмотра графического представления плана запроса, времени выполнения и статуса узлов плана.

Шаг 7. Изменение таблицы

Для изменения таблицы используйте команду ALTER TABLE. Эта команда позволяет переименовывать таблицу, добавлять, удалять и переименовывать столбцы, изменять партиции, менять ограничения (constraint) и многое другое. В этом разделе приводятся примеры добавления и удаления ограничения, а также добавления столбца.

Добавление ограничения

Следующая команда добавляет ограничение CHECK для проверки диаметра планеты:

ALTER TABLE planets
    ADD CONSTRAINT diameter_check CHECK (diameter_km > 0);

Результат:

ALTER TABLE

При добавлении ограничения CHECK ADB выполняет проверку, чтобы убедиться, что все текущие строки таблицы удовлетворяют новому ограничению. С помощью опции NOT VALID эту начальную проверку можно пропустить. Ограничение применяется к будущим добавлениям и обновлениям строк: попытки добавить планету с диаметром, меньшим или равным 0, приведут к ошибке: new row for relation "planets" violates check constraint "diameter_check".

После создания ограничение можно переименовать или удалить, но нельзя изменить его условие.

Удаление ограничения

Следующая команда удаляет ограничение diameter_check:

ALTER TABLE planets
    DROP CONSTRAINT diameter_check;

Результат:

ALTER TABLE

Добавление столбца

Следующая команда добавляет новый столбец discovered_year в таблицу planets:

ALTER TABLE planets
    ADD COLUMN discovered_year INTEGER;

Результат:

ALTER TABLE

Все существующие строки будут иметь значение NULL в новом столбце discovered_year.

Обратите внимание, что в ADB 6 (как и в Greengage DB 6) опция ADD COLUMN требует перезаписи таблицы для строковых таблиц. Для больших таблиц это может занять значительное время.

Шаг 8. Обновление данных в таблице

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

Следующая команда изменяет значение diameter_km для планет типа Terrestrial:

UPDATE planets SET diameter_km = diameter_km - 1 WHERE type = 'Terrestrial';

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

UPDATE 4

Следующая команда добавляет (visited) к планетам, у которых есть миссии, используя данные из таблицы missions:

UPDATE planets
SET name = name || ' (visited)'
WHERE planet_id IN (SELECT DISTINCT planet_id FROM missions);

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

UPDATE 2

Проверьте результаты:

SELECT name FROM planets;

Результат должен быть:

       name
-------------------
 Venus
 Mercury
 Tatooine
 Mars (visited)
 Jupiter (visited)
 Earth
(6 rows)

Шаг 9. Удаление данных из таблицы

Для удаления одной или нескольких строк из таблицы используйте команду DELETE FROM, укажите имя таблицы, опишите условия запроса в выражении WHERE и завершите команду точкой с запятой ;.

Следующая команда удаляет строки, содержащие постфикс (visited) в столбце name:

DELETE FROM planets
WHERE name LIKE '% (visited)';

Вывод показывает количество удаленных строк:

DELETE 2

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

Очистка таблицы

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

Следующая команда удаляет все строки из таблицы planets:

TRUNCATE planets;

Результат:

TRUNCATE TABLE

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

TRUNCATE missions, stars;
ВАЖНО

В отличие от DELETE, команда TRUNCATE сразу удаляет файлы данных.

Строки, удаленные с помощью DELETE (или устаревшие в результате UPDATE), физически не удаляются из таблицы до выполнения операции VACUUM. ADB предоставляет скрипты обслуживания, которые периодически запускаются на кластере, — в их число входит периодический запуск VACUUM.

Подробнее об освобождении дискового пространства, включая просмотр "мертвых" строк в таблице и проверку таблиц на раздувание (bloat), см. документацию Greengage DB.

Шаг 10. Удаление таблицы

Для удаления таблицы из базы данных используйте команду DROP TABLE и укажите имя таблицы.

Следующая команда удаляет таблицу planets:

DROP TABLE planets;

Результат:

DROP TABLE

Для удаления нескольких таблиц одновременно перечислите их имена через запятую в одной команде DROP TABLE, например:

DROP TABLE missions, stars;

Шаг 11. Удаление базы данных

Чтобы удалить базу данных, используйте команду DROP DATABASE. Обратите внимание, что базу данных нельзя удалить, если к ней есть активные клиентские подключения.

  1. Переключитесь на другую базу данных:

    \c adb
  2. Введите DROP DATABASE и имя базы данных:

DROP DATABASE universe;

Результат:

DROP DATABASE
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней