PostgreSQL 创建表空间

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

摘要:在本教程中,您将学习如何使用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 DATABASE , CREATE TABLE 和 CREATE INDEX 语句中指定它来存储表空间中对象的数据文件。

PostgreSQL 创建表示例

以下语句使用 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 表空间的物流数据库:

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 语句创建新表空间。