有时我们需要把不同的表放到不同的存储介质或文件系统下, 这时就需要用到表空间, 在PostgreSQL中, 表空间实际上是为表指定一个存储目录。
在创建数据库时可以为其指定默认的表空间。
创建表、 创建索引的时候可以指定表空间, 这样表、 索引就可以存储到表空间对应的目录下了。
创建表空间
创建表空间的语法如下:
CREATE TABLESPACE tablespace_name [ OWNER user_name ] LOCATION 'directory'
例:
CREATE TABLESPACE tbs_data location '/data/pgdata';
指定默认表空间
创建数据库时可以指定默认的表空间, 这样以后在此数据库中创建表、 索引时就可以自动存储到表空间指定的目录下:
create database db01 tablespace tbs_data;
改变数据库的默认表空间的语法如下:
ALTER DATABASE db01 set TABLESPACE tbs_data;
注:在执行该操作时, 不能有用户连接到这个数据库上, 否则会报如下错误:
ERROR: database "db01" is being accessed by other users
DETAIL: There is 1 other session using the database.
另外, 改变数据库的默认表空间时, 数据库中已有表的表空间不会改变。
创建表时也可以指定表空间, 命令如下:
create table test01(id int, note text) tablespace tbs_data;
创建索引时同样可以指定表空间, 命令如下:
create index idx_test01_id on test01(id) tablespace tbs_data;
创建唯一约束时可指定约束索引的表空间, 命令如下:
ALTER TABLE test01 ADD CONSTRAINT unique_test01_id unique(id) USING INDEX TABLESPACE tbs_data;
增加主键时也可以指定主键索引的表空间, 命令如下:
ALTER TABLE test01 ADD CONSTRAINT pk_test01_id primary key(id) USING INDEX TABLESPACE tbs_data;
查看表空间
表空间信息位于pg_tablespace中:
select * from pg_tablespace;
查询表空间及位置要用到pg_tablespace_location():
SELECT
t.spcname AS "Tablespace Name",
t.spcacl AS "Access Privileges",
pg_tablespace_location(t.oid) AS "Location"
FROM
pg_tablespace t;
查询一个数据库下各种对象所在表空间,若为空表示是数据库默认表空间:
SELECT n.nspname AS schema
,c.relname AS relname
,t.spcname AS tablespace
,c.relkind
FROM pg_class c
inner JOIN pg_namespace n
ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t
ON t.oid = c.reltablespace
WHERE n.nspname NOT LIKE 'pg_%'
AND n.nspname NOT LIKE 'information_schema%'
order by c.relkind
,c.relname
;
修改表空间
把表从一个表空间移到另一个表空间的命令如下:
alter table test01 set tablespace pg_default;
把索引从一个表空间移到另一个表空间的命令如下:
ALTER INDEX index_name SET TABLESPACE new_tablespace;
注意, 在移动表的时候表会被锁定, 对此表的所有操作都将无法执行, 包括SELECT操作, 所以请考虑在合适的时机做这个操作。
最后修改时间:2024-12-27 14:51:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




