1. 表空间介绍
表空间即PostgreSQL存储数据文件的位置,其中包括数据库对象。如,索引、表等。
PostgreSQL使用表空间映射逻辑名称和磁盘物理位置。默认提供了两个表空间:
pg_default 表空间存储用户数据
pg_global 表空间存储全局数据
利用表空间可以控制PostgreSQL的磁盘布局,它有两方面的优势:
首先,如果集群中的某个分区超出初始空间,可以在另一个分区上创建新的表空间并使用。后期可以重新配置系统。
其次,可以使用统计优化数据库性能。举例,可以把频繁访问的索引或表放在高性能的磁盘上,如固态硬盘;把归档数据放在较慢的设备上。
2.创建表空间
使用CREATE TABLESPACE语句创建表空间,语法如下:
CREATE TABLESPACE tablespace_name
OWNER user_name
LOCATION directory_path;
表空间名称不能以pg开头,因为这些名称为系统表空间保留。默认执行CREATE TABLESPACE语句的用户是表空间的拥有者。如果需要给其他用户赋权,可以值后面指定owner关键词。
directory_path是表空间使用空目录的绝对路径,PostgreSQL的用户必须拥有该目录的权限可以进行读写操作。
一旦创建好表空间,可以在CREATE DATABASE, CREATE TABLE 和 CREATE INDEX 语句中使用。
3.示例
连接数据库,使用\db+命令查看详细的默认表空间信息。
postgres=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+----------+-------------------+---------+--------+-------------
pg_default | postgres | | | | 30 MB |
pg_global | postgres | | | | 574 kB |
(2 rows)
创建表空间:(先确保这个目录存在,若果不存在自行去root登录后创建该目录,或者另指定存在的目录)
postgres=# create tablespace "sensor_tablespace" location '/data/postgresData';
CREATE TABLESPACE
ERROR: could not set permissions on directory "/data/postgresData": Operation not permitted
报错信息表明没有权限创建,应当登录root去修改一下这个目录归属权限给postgres用户后再去创建
chown -R postgres /data/postgresData/
此时再查看表空间信息
postgres=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
-------------------+----------+--------------------+-------------------+---------+---------+-------------
pg_default | postgres | | | | 30 MB |
pg_global | postgres | | | | 574 kB |
sensor_tablespace | postgres | /data/postgresData | | | 0 bytes |
(3 rows)
4、timescaledb附加表空间
为超表tb_sensor_data附加表空间
SELECT attach_tablespace('sensor_tablespace', 'tb_sensor_data', if_not_attached => true);
如果需要将表空间分离出表空间,可使用以下命令
//分离某表某空间
SELECT detach_tablespace('tableSpaceName', 'hyperTableName');
//分离某表某空间且当空间附加关系存在
SELECT detach_tablespace('tableSpaceName', 'hyperTableName', if_attached => true);
//分离某空间,不论与几个表有附加关系
SELECT detach_tablespace('tableSpaceName');
//分离某表所有空间
SELECT detach_tablespace('hyperTableName');
- 如果一张超表有多个表空间,暂时不知道是以什么策略分配(官方文档未给出)
- 如果一张超表附加了新的表空间,并且分离出默认表空间,并不会影响查询,并且只有在下一个chunk才会落在新的表空间。