PostgreSQL 不建议使用独立表空间

news/2024/7/9 20:07:06 标签: 数据库, oracle, postgresql

 

有Oracle使用经历的用户都会认为表空间非常重要,但对PostgreSQL中的表空间却知之甚少。本文将解释它们是什么,何时有用以及是否应该使用它们。

什么是表空间

本质上,PostgreSQL中的表空间是一个包含数据文件的目录。这些数据文件是表、序列、索引和物化视图等对象背后的存储空间。在PostgreSQL中,每个这样的对象都有自己的数据文件。如果对象很大,它将有几个被称为segments的文件,大小限制为1GB。

PostgreSQL使用操作系统自带的文件系统进行存储。这与Oracle不同,后者实际上实现了自己的“文件系统”。

让我们比较一下这些术语:

Oracle 和 PostgreSQL中的术语

OraclePostgreSQL 或 操作系统
tablespace(表空间)file system(文件系统)
datafile(数据文件)logical/physical volume(逻辑/物理卷)
segment(段)all data files of a table(表的所有数据文件)
extent(区)segment data file(段/数据文件)

默认表空间

每个PostgreSQL数据库集群最初有两个表空间。你可以在psql
中用\db
列出它们:

     List of tablespaces
    Name    |  Owner   | Location 
------------+----------+----------
 pg_default | postgres | 
 pg_global  | postgres | 
(2 rows)

这里没有指定位置。是因为它们总是对应于PostgreSQL数据目录的固定子目录:默认表空间(pg_default
)是base
子目录,全局表空间(pg_global
)是global
子目录。

默认情况下,所有数据文件都存储在默认表空间中。只有某些对象存储在全局表空间中:目录表pg_database
pg_authid
pg_tablespace
pg_shdepend
及其所有索引。这些是所有数据库共享的唯一目录表。

创建和使用新的表空间

要创建一个新的表空间,首先必须创建一个新目录。不要在PostgreSQL数据目录中创建该目录!

注意,该目录必须属于“postgres”数据库操作系统用户(确切地说,该用户必须具有更改目录权限的权限)。

然后创建表空间:

CREATE TABLESPACE mytbsp LOCATION '/tmp/mytbsp';

要使用表空间,你可以创建一个表或其他包含存储空间的对象:

也可以将创建的表空间设置为默认表空间:
set default_tablespace = pgtbl_test;
create table foo(i int);

CREATE TABLE newtab (
   id  integer NOT NULL,
   val text    NOT NULL
) TABLESPACE mytbsp;
 
ALTER TABLE newtab
   ADD CONSTRAINT newtab_pkey PRIMARY KEY (id)
   USING INDEX TABLESPACE mytbsp;
 
CREATE INDEX newtab_val_idx ON newtab (val)
   TABLESPACE mytbsp;

注意,索引不会自动创建在与表相同的表空间中。

你也可以在表空间中创建一个数据库:

CREATE DATABASE newdb TABLESPACE mytbsp;

然后,您在该数据库中创建的所有对象将自动放在数据库的表空间中。

您可以使用ALTER
命令修改任何对象的表空间。把一个对象移动到另一个表空间将复制数据文件,并且在移动该对象时无法访问它。

备份和表空间

如果对具有表空间的数据库执行文件系统备份,则必须备份所有表空间。您不能备份或恢复单个表空间,也没有类似Oracle的“可传输表空间”。

普通格式的pg_basebackup
将尝试把表空间保存在与数据库服务器相同的位置(-D选项仅指定数据目录的位置)。要将数据从一个表空间备份到另一个位置,你必须使用选项——tablespace-mapping=olddir=newdir
。可以对多个表空间多次使用此选项。

使用表空间使数据库管理更加复杂,因为PG数据目录不再包含所有数据。

什么时候创建表空间?

在绝大多数情况下,不应该在PostgreSQL中创建额外的表空间。特别是,在与数据目录相同的文件系统上创建一个表空间,或者在与另一个表空间相同的文件系统上创建一个表空间,都没有意义。

那么,表空间有哪些优点可以证明管理的复杂性是合理的呢?

  1. 如果您的数据分布在不同设备上的几个文件系统上,那么您可以分配I/O负载。然而,这也可以通过在较低的级别上进行剥离来完成。

  2. 如果磁盘上的空间用完,表空间将为您提供添加更多存储空间的选项。然而,现在通常可以使用某种类型的卷管理器在操作系统级上完成此工作。

  3. 如果要对数据库或表设置大小限制,可以将其放在文件系统的表空间中。

  4. 如果您同时拥有快速、昂贵和缓慢、廉价的存储空间,那么您可以将需要良好性能的对象放在快速存储空间上的单独表空间中。在这种情况下,您应该调整表空间上的seq_page_cost
    random_page_cost
    effecve_io_concurrency
    选项,以便将性能特征告诉优化器。

  5. 如果希望在默认表空间之外的其他地方创建临时文件(用于临时表和用于查询处理),可以将temp_tablespaces参数设置为不同的表空间。

如果您运行在虚拟化环境中,使用虚拟化存储,那么除了第三点之外,其他的点都是没有意义的。由于现在几乎所有人都在使用虚拟化,表空间正在成为PostgreSQL越来越不重要的特性。

消除一个旧的的错误的观点

数据库管理员中流传着一个根深蒂固的神话,即为了获得良好的性能,您应该将表和索引放在不同的磁盘上。

您将听到人们详细阐述为什么索引扫描期间访问模式的特定相互作用会使其在旋转磁盘上有效。但是旋转磁盘正在停止工作,通常只会使用多个并发 SQL 语句来使存储系统饱和,但无论如何,所有此类访问模式都会中断。

这种误解背后的事实是,将I/O负载分散到多个设备上肯定是有益的。如果在操作系统级别使用条带化,与小心放置表和索引相比,将获得更好的分布。

结论

表空间在PostgreSQL中很少相关。抵制创建表空间的诱惑,将所有数据保留在默认表空间中。


http://www.niftyadmin.cn/n/129893.html

相关文章

OperWrt 环境搭建01

文章目录 OperWrt 环境搭建01首次编译第二次编译重新配置知识点OperWrt 环境搭建01 首次编译 openwrt源代码下载(lede为例说明) #Lean 大佬的源码仓库 需要访问github 可能速度不行 git clone https://github.com/coolsnowwolf/lede# 或者 使用下面的国内镜像源 下载比较快 g…

Xmind快捷键大全

Xmind快捷键大全 1、常用 CtrlShiftL 快捷键助手CtrlHome 返回中心主题Enter 插入主题Tab 插入子主题F2 编辑主题F3 添加/编辑标签F4 添加/编辑备注F6 下钻ShiftF6 上钻Delete 删除Ctrl] 插入摘要CtrlI 插入图片CtrlShiftH 插入超链接Ctrl1,2,3,4,5,6快速添加优先等级图标Ctr…

Vue2的基本使用

一、vue的基本使用 第一步 引入vue.js文件 <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script> 或者<script src"./js/vue.js"></script> 第二步 在body中设置一个挂载点 {{msg}} <div id"app…

中断和事件

目录 中断概述 什么是中断&#xff1f; 什么是EXTI&#xff1f; EXTI初始化结构体&#xff1a; 中断/事件线&#xff1a; EXTI模式&#xff1a; 触发类型&#xff1a; EXTI控制&#xff1a; 什么是优先级&#xff1f; 什么是优先级分组&#xff1f; 什么是NVIC&#…

【基于STM32的多功能台灯控制】

基于STM32的多功能台灯控制 在之前一篇博文中已出过智能台灯相关的介绍&#xff0c;在这里对之前的模块以及功能上进行了优化和功能上的改进&#xff0c;需源码或实物可私【创作不易-拒绝白嫖】 功能说明 1、按键模式多功能台灯在设计上使用了4个按键分别做为 按键1模式的切换…

vim-gvim使用教程 常用配置

目录gvim和vim的区别常用的工作模式常用命令配置文件设置.vimrcgvim和vim的区别 和Word等富文本编辑器不同的是&#xff0c;vim编辑器的功能没有那么丰富&#xff0c;是贫文本编辑器&#xff0c;且一般应用于Linux环境下&#xff0c;但是由于做了一系列的优化和适配&#xff0…

【刷题】-- 基础 -- 二分查找

精于结构、敏于心智、熟于代码 方式&#xff1a;对于会的代码&#xff1a;学会以最快的速度构建&#xff0c;并以最快的速度书写&#xff1b;对于不会的代码&#xff1a;学会&#xff08;以最短的路径下&#xff09;看懂别人的代码。学会使用参考文档、熟悉每一个容器。 刷题位…

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…