PostgreSQL 教程: CREATE TABLESPACE 创建表空间

九月 14, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的CREATE TABLESPACE语句创建表空间。

PostgreSQL 表空间简介

表空间是磁盘上的一个位置,PostgreSQL 在其中存储包含数据库对象(例如索引和表)的数据文件。

PostgreSQL 使用表空间将逻辑名称映射到磁盘上的物理位置。

PostgreSQL 有两个默认表空间:

  • pg_default表空间存储用户数据。
  • pg_global表空间存储全局数据。

表空间允许您控制 PostgreSQL 的磁盘布局。使用表空间有两个主要优点:

  • 首先,如果实例初始化时的分区空间不足,您可以在不同的分区上创建一个新表空间并使用它,直到重新配置系统。
  • 其次,可以使用统计数据来优化数据库性能。例如,您可以将频繁访问的索引或表放置在性能非常快的设备(例如固态设备)上,并将包含很少使用的存档数据的表放置在速度较慢的设备上。

PostgreSQL CREATE TABLESPACE 语句

要创建新表空间,请使用CREATE TABLESPACE语句,如下:

CREATE TABLESPACE tablespace_name
OWNER user_name
LOCATION directory_path;

表空间的名称不应以pg_开头,因为这些名称是为系统表空间保留的。

默认情况下,执行CREATE TABLESPACE命令的用户是该表空间的所有者。要将另一个用户指定为表空间的所有者,请在OWNER关键字后指定它。

directory_path是用于表空间的一个空目录的绝对路径。PostgreSQL 系统用户必须拥有此目录才能在其中读取和写入数据。

表空间创建完成后,可以在CREATE DATABASECREATE TABLECREATE INDEX语句中指定存储对象数据文件的表空间。

PostgreSQL CREATE TABLESPACE 示例

以下语句使用CREATE TABLESPACE创建一个名为ts_primary的新表空间,其物理位置为c:\pgdata\primary

CREATE TABLESPACE ts_primary 
LOCATION 'c:\pgdata\primary';

请注意,该语句使用 Unix 风格的斜杠表示目录路径。在执行该命令之前,c:\pgdata\primary必须存在。

要列出当前 PostgreSQL 数据库服务器中的所有表空间,请使用以下\db命令:

\db

输出:

           List of tablespaces
    Name    |  Owner   |     Location
------------+----------+-------------------
 pg_default | postgres |
 pg_global  | postgres |
 ts_primary | postgres | c:\pgdata\primary
(4 rows)

\db+命令显示更多信息,例如大小和访问权限:

                                       List of tablespaces
    Name    |  Owner   |     Location      | Access privileges | Options |  Size   | Description
------------+----------+-------------------+-------------------+---------+---------+-------------
 pg_default | postgres |                   |                   |         | 124 MB  |
 pg_global  | postgres |                   |                   |         | 625 kB  |
 ts_primary | postgres | c:\pgdata\primary |                   |         | 0 bytes |
(4 rows)

以下语句使用ts_primary表空间创建logistics数据库:

CREATE DATABASE logistics 
TABLESPACE ts_primary;

TABLESPACE子句指示logistics数据库将用于存储数据的表空间。

以下语句创建一个新表,名为deliveries,并向该表中插入一行:

CREATE TABLE deliveries (
    delivery_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, 
    order_date DATE, 
    customer_id INT
);

INSERT INTO deliveries(order_date, customer_id)
VALUES('2020-08-01',1);

由于ts_primary表空间有一些数据,可以在psql中使用以下命令查看其信息:

\db+ ts_primary

输出:

    Name    |  Owner   |     Location      | Access privileges | Options |  Size   | Description
------------+----------+-------------------+-------------------+---------+---------+-------------
 ts_primary | postgres | c:\pgdata\primary |                   |         | 8033 kB |
(1 row)

概括

  • 表空间是存储设备上 PostgreSQL 存储数据文件的位置。

  • 使用CREATE TABLESAPCE语句创建一个新的表空间。