Табличные пространства
Табличные пространства (tablespaces) позволяют указывать расположения в файловой системе, где хранятся файлы объектов базы данных, таких как таблицы и индексы. Это дает возможность оптимизировать производительность, размещая часто запрашиваемые данные на быстром хранилище, а исторические или менее важные данные на более медленном.
Табличное пространство — это глобальный объект, который можно использовать в любой базе данных при наличии соответствующих прав.
Предопределенные табличные пространства
В инициализированном кластере Greengage DB присутствуют два предопределенных табличных пространства:
-
pg_global
Табличное пространство, используемое для системных каталогов кластера, общих для всех баз данных.
-
pg_default
Табличное пространство, используемое по умолчанию. Например, базы данных
template0
иtemplate1
используют это табличное пространство. Табличное пространствоpg_default
также используется по умолчанию для новых объектов баз данных, если только явно не указано другое табличное пространство.
Создание табличных пространств
Создание каталогов хранения
Перед созданием табличного пространства необходимо подготовить каталоги для хранения данных. Эти каталоги должны удовлетворять следующим требованиям:
-
Существовать на всех хостах кластера, включая мастер-хост, резервный мастер-хост и сегмент-хосты.
-
Быть пустыми.
-
Принадлежать административному пользователю Greengage DB (обычно
gpadmin
). -
Не располагаться на съемном или временном носителе. Кластер может стать неработоспособным в случае потери табличного пространства в результате удаления каталога или сбоя диска.
Для выполнения команд, описанных в следующих разделах, подключитесь к мастер-хосту Greengage DB от имени пользователя gpadmin
, как описано в статье Подключение к Greengage DB с использованием psql.
Также создайте каталог /fast_storage на всех хостах кластера.
Ниже приведен пример скрипта, демонстрирующий, как это сделать с помощью утилиты gpssh
:
#!/bin/bash
sudo -n mkdir -p /fast_storage && sudo chown gpadmin:gpadmin /fast_storage
gpssh -h smdw -e "sudo -n mkdir -p /fast_storage && sudo chown gpadmin:gpadmin /fast_storage"
gpssh -f hostfile_segment_hosts -e "sudo mkdir -p /fast_storage && sudo chown -R gpadmin:gpadmin /fast_storage"
Создание табличного пространства
Чтобы создать табличное пространство, используйте команду CREATE TABLESPACE
.
Выражение LOCATION
устанавливает путь к каталогу табличного пространства:
CREATE TABLESPACE fast_storage LOCATION '/fast_storage';
При необходимости можно добавить комментарий к созданному табличному пространству:
COMMENT ON TABLESPACE fast_storage IS 'High-speed local SSD storage';
Вы можете разрешить конечным пользователям использовать созданное табличное пространство, предоставив им привилегию CREATE
.
Например, пользователи могут создавать новые объекты в этом табличном пространстве или перемещать в него существующие объекты.
Просмотр информации о табличных пространствах
Чтобы отобразить список табличных пространств, используйте метакоманду \db
:
\db+
Результат может выглядеть так:
List of tablespaces Name | Owner | Location | Access privileges | Options | Description --------------+---------+---------------+-------------------+---------+------------------------------ fast_storage | gpadmin | /fast_storage | | | High-speed local SSD storage pg_default | gpadmin | | | | pg_global | gpadmin | | | |
Обратите внимание на столбец Location
:
-
Для табличных пространств, созданных пользователем, этот столбец показывает их физическое расположение.
-
Для предопределенных табличных пространств этот столбец пуст. Расположение предопределенных табличных пространств совпадает с каталогами данных, указанными при инициализации кластера.
Вы также можете выполнить запрос к системному каталогу pg_tablespace
, чтобы получить список табличных пространств.
SELECT oid, *
FROM pg_tablespace;
Результат выглядит следующим образом:
oid | spcname | spcowner | spcacl | spcoptions -------+--------------+----------+--------+------------ 1663 | pg_default | 10 | | 1664 | pg_global | 10 | | 41003 | fast_storage | 10 | |
Вы можете вызвать функцию gp_tablespace_location()
, чтобы получить расположение табличного пространства по значению oid
:
SELECT * FROM gp_tablespace_location(41003);
Вывод может выглядеть следующим образом:
gp_segment_id | tblspc_loc ---------------+--------------- 3 | /fast_storage 0 | /fast_storage 1 | /fast_storage 2 | /fast_storage -1 | /fast_storage
Следующий запрос использует имя табличного пространства, функцию gp_tablespace_location()
и системную таблицу gp_segment_configuration
для отображения информации о расположении табличного пространства fast_storage
в файловых системах всех сегментов:
SELECT segment_config.role,
tablespace_location.gp_segment_id AS segment_id,
segment_config.hostname,
segment_config.datadir,
tablespace_location.tblspc_loc
FROM gp_tablespace_location(
(SELECT oid
FROM pg_tablespace
WHERE spcname = 'fast_storage')) AS tablespace_location
JOIN gp_segment_configuration AS segment_config ON tablespace_location.gp_segment_id = segment_config.content
ORDER BY segment_id;
Результат выглядит следующим образом:
role | segment_id | hostname | datadir | tblspc_loc ------+------------+----------+-----------------------+--------------- p | -1 | mdw | /data1/master/gpseg-1 | /fast_storage m | -1 | smdw | /data1/master/gpseg-1 | /fast_storage p | 0 | sdw1 | /data1/primary/gpseg0 | /fast_storage m | 0 | sdw2 | /data1/mirror/gpseg0 | /fast_storage p | 1 | sdw1 | /data1/primary/gpseg1 | /fast_storage m | 1 | sdw2 | /data1/mirror/gpseg1 | /fast_storage p | 2 | sdw2 | /data1/primary/gpseg2 | /fast_storage m | 2 | sdw1 | /data1/mirror/gpseg2 | /fast_storage m | 3 | sdw1 | /data1/mirror/gpseg3 | /fast_storage p | 3 | sdw2 | /data1/primary/gpseg3 | /fast_storage
На уровне системы табличные пространства хранятся как символические ссылки в каталоге pg_tblspc внутри каталогов данных каждого сегмента. Эти ссылки указывают на фактическое расположение табличного пространства в файловой системе.
Размещение объектов в табличном пространстве
Чтобы разместить объект в определенном табличном пространстве, используйте команды CREATE
или ALTER
с выражением TABLESPACE
.
По умолчанию при создании объектов с помощью команды CREATE
используются следующие табличные пространства:
-
Команда
CREATE DATABASE
создает базу данных, используя табличное пространство, указанное для шаблонной базы данных. Обычно это база данныхtemplate1
, если в выраженииTEMPLATE
не указана другая. -
Команды
CREATE TABLE
,CREATE INDEX
иCREATE MATERIALIZED VIEW
используют табличное пространство, указанное в параметре конфигурации сервераdefault_tablespace
. Узнать, как изменить этот параметр, можно в разделе Настройка табличных пространств по умолчанию.
Команды в этом разделе демонстрируют, как расположить объект в определенном табличном пространстве во время его создания.
Базы данных
Чтобы указать табличное пространство, используйте выражение TABLESPACE
при создании базы данных:
CREATE DATABASE books_store TABLESPACE fast_storage;
Метакоманда \l+
позволяет увидеть табличные пространства, используемые различными базами данных, в столбце Tablespace
:
\l+
Результат выглядит следующим образом:
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description -------------+---------+----------+------------+------------+---------------------+-------+--------------+-------------------------------------------- books_store | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | | 81 MB | fast_storage | postgres | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | | 83 MB | pg_default | default administrative connection database template0 | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/gpadmin +| 81 MB | pg_default | unmodifiable empty database | | | | | gpadmin=CTc/gpadmin | | | template1 | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/gpadmin +| 81 MB | pg_default | default template for new databases | | | | | gpadmin=CTc/gpadmin | | |
Обратите внимание, что все объекты, созданные в этой базе данных, будут использовать ее табличное пространство. При необходимости вы можете явно задать табличное пространство, используемое объектом базы данных, как описано в следующих разделах.
Таблицы
Эта команда показывает, как указать табличное пространство при создании новой таблицы:
CREATE TABLE movies
(
movie_id SERIAL PRIMARY KEY,
genre TEXT NOT NULL
)
TABLESPACE fast_storage
DISTRIBUTED BY (movie_id);
Чтобы определить табличное пространство, используемое таблицей, выполните запрос к представлению pg_tables
:
SELECT *
FROM pg_tables
WHERE tablename = 'movies';
Столбец tablespace
показывает используемое табличное пространство:
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers ------------+-----------+------------+--------------+------------+----------+------------- public | movies | gpadmin | fast_storage | t | f | f
Индексы
Укажите табличное пространство при создании индекса следующим образом:
CREATE INDEX movies_genre_idx
ON movies (genre)
TABLESPACE fast_storage;
Чтобы определить табличное пространство, используемое индексом, выполните запрос к представлению pg_indexes
:
SELECT *
FROM pg_indexes
WHERE tablename = 'movies';
Результат выглядит следующим образом:
schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+------------------+--------------+------------------------------------------------------------------------- public | movies | movies_pkey | | CREATE UNIQUE INDEX movies_pkey ON public.movies USING btree (movie_id) public | movies | movies_genre_idx | fast_storage | CREATE INDEX movies_genre_idx ON public.movies USING btree (genre)
Материализованные представления
Следующая команда показывает, как указать табличное пространство для материализованного представления:
CREATE MATERIALIZED VIEW comedies TABLESPACE fast_storage AS
SELECT *
FROM movies
WHERE genre = 'comedy';
Для определения табличного пространства, используемого материализованным представлением, выполните запрос к представлению pg_matviews
:
SELECT *
FROM pg_matviews
WHERE matviewname = 'comedies';
Результат выглядит следующим образом:
schemaname | matviewname | matviewowner | tablespace | hasindexes | ispopulated | definition ------------+-------------+--------------+--------------+------------+-------------+------------------------------------------ public | comedies | gpadmin | fast_storage | f | t | SELECT movies.movie_id, + | | | | | | movies.genre + | | | | | | FROM movies + | | | | | | WHERE (movies.genre = 'comedy'::text);
Перемещение объектов в другое табличное пространство
Чтобы изменить табличное пространство для указанного объекта, используйте команду ALTER
с выражением SET TABLESPACE
.
Приведенные ниже команды перемещают объекты, созданные в разделе Размещение объектов в табличном пространстве, в табличное пространство по умолчанию pg_default
:
ALTER DATABASE books_store
SET TABLESPACE pg_default;
ALTER TABLE movies
SET TABLESPACE pg_default;
ALTER INDEX movies_genre_idx
SET TABLESPACE pg_default;
ALTER MATERIALIZED VIEW comedies
SET TABLESPACE pg_default;
Настройка табличных пространств по умолчанию
Новые объекты
Параметр конфигурации сервера default_tablespace
позволяет указать табличное пространство по умолчанию для объектов базы данных, созданных с помощью следующих команд:
-
CREATE TABLE
-
CREATE INDEX
-
CREATE MATERIALIZED VIEW
Обратите внимание, что параметр default_tablespace
не учитывается при выполнении команды CREATE DATABASE
.
В этом случае создаваемая база данных наследует табличное пространство, используемое шаблонной базой данный.
Обычно это база данных template1
, если только в выражении TEMPLATE
не указана другая база данных.
Следующая команда устанавливает fast_storage
табличным пространством по умолчанию с помощью gpconfig
:
$ gpconfig -c default_tablespace -v 'fast_storage' --masteronly
Чтобы применить изменения, перезагрузите конфигурацию с помощью команды gpstop
:
$ gpstop -u
Временные объекты
Табличные пространства также используются для хранения временных объектов, включая:
-
Временные таблицы и индексы, созданные вручную с помощью команды
CREATE TEMP TABLE
. -
Временные и spill-файлы, которые создаются автоматически для поддержки выполнения запросов, включая хеш-агрегирование (hash aggregate), хеш-соединение (hash join) и сортировку больших наборов данных.
-
Временные таблицы, которые создаются автоматически при обновлении данных материализованного представления.
Есть два параметра конфигурации сервера, которые контролируют, где хранятся временные объекты:
-
temp_tablespaces
управляет местоположением всех типов временных объектов. -
temp_spill_files_tablespaces
позволяет хранить автоматически создаваемые временные и spill-файлы в отдельных табличных пространствах. Если этот параметр установлен, он имеет приоритет надtemp_tablespaces
для таких файлов.
Оба параметра принимают список табличных пространств через запятую. Для каждого временного объекта табличное пространство выбирается случайным образом. Это позволяет распределить нагрузку по нескольким табличным пространствам.
Значения по умолчанию для параметров temp_tablespaces
и temp_spill_files_tablespaces
— пустые строки, соответствующие табличному пространству по умолчанию для текущей базы данных.
Следующая команда показывает, как задать табличное пространство по умолчанию для временных объектов на уровне кластера с помощью gpconfig
:
$ gpconfig -c temp_tablespaces -v 'fast_storage' --masteronly
Чтобы применить изменения, перезагрузите конфигурацию с помощью команды gpstop
:
$ gpstop -u
Удаление табличного пространства
Для удаления табличного пространства используйте команду DROP TABLESPACE
:
DROP TABLESPACE fast_storage;
Вы можете удалить табличное пространство, только если оно пустое. Перед удалением убедитесь, что оно не используется объектами базы данных. Также табличное пространство не должно содержать временных и транзакционных файлов.