PostgreSQL的数据存储(十三)---数据存储

本文详细阐述了SQL DML操作对于数据页面存储状态的变化,包括空页面、数据插入、数据删除、数据更新的状态变化,并介绍了相关的系统函数调用。

4.4     SQL操作对页面的影响

4.4.1       DML操作对于页面存储格式的影响

页面从一个新的状态,到放入数据,数据经过DML操作,页面的数据发生变化,在结果vacuum清理数据后,页面数据又变为一个整齐状态。如下从四个角度来说DML操作对于数据页面的影响。

 

一 空页面


PostgreSQL的数据存储(十三)---数据存储 - 那海蓝蓝 - 那海蓝蓝的博客

 

   一个页面大小为8k,其中,页头占一小部分,特殊块从页尾的位置占一小部分,其余大部分空间,为数据占用。在上图中,“页数据”标识的位置处,都是用于存储数据的。

 

二 数据插入后页面的状态

 

如果是往一个表上插入数据,其插入方式,如上图,从页尾开始存放第一条记录,然后是第二条、直至本页空间不够。

如果是不同的表,PG的处理方式,是不同表由不同文件组成,不同文件的块(8k)映射不同的buf,则往不同的表上插入数据的时候,对应的页一定不同。

 

三 数据删除后页面的状态

元组(tuple)的删除,则更为简单,对于页面来讲,当找到tuple所在的页,直接为tuple的一个“信息位”(cmax)置新的值即可。这说明,PG删除元组的操作,不是真正从页面上把元组去掉,也不是如Oracle,把旧信息置于回滚段,而是直接在元组头上标识一个“删除标志”。此标志,是一个数值型的一个值,表示一个被删除的元组是否被其他“事务”(活动着的连接)看到。[1]

以上描述,可以通过查看heap_delete函数的如下调用了解:

HeapTupleHeaderAdjustCmax(tp.t_data, &cid,&iscombo);

 

四 数据更新后页面的状态

元组更新,是删除操作和插入操作的组合。这点,可以从heap_update函数代码得知。

五 扩展知识

       以上四条,是用户表、用户数据在内存(数据页)中的数据增删改和初始新页面时的状态,系统表和系统表的数据,也是以tuple格式存放的,一样的存储方式。

    本节没有就索引页面的存储格式展开讨论。

    如下是相关函数的一部分调用关系:

PageHasFreeLinePointers     

       PageAddItem

              RelationPutHeapTuple

                     heap_insert

                            CopyFrom

                            intorel_receive

                            simple_heap_insert

                            ExecInsert

                            ATRewriteTable

                            toast_save_datum

                     heap_update

       PageGetHeapFreeSpace

 



[1] PG的MVCC技术,其中,涉及存储层的,有个名词叫做“元组可见性”,是原来表明哪些事务可以读到某个元组、哪些事务不能读到某个元组。

 “元组可见性”可以通过HeapTupleSatisfiesVisibility、HeapTupleSatisfiesUpdate等调用关系追踪。


<think>首先,用户的问题是关于如何安装PostgreSQL和pgvector插件。用户的查询是:"我想获取PostgreSQL向量数据插件pgvector的安装方法,同时附带PostgreSQL的安装方法"。 系统级指令要求: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层要求: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]:提供了一个优快云链接,关于pgvector安装和PostgreSQL安装。 - 引用[2]:类似的信息,但似乎是一个片段,描述了安装步骤。 我需要基于这些引用构建一个清晰的安装指南。引用中提到了PostgreSQL 14.0和从GitHub克隆pgvector。 结构化回答: 1. **介绍**:简要说明pgvector和PostgreSQL。 2. **PostgreSQL安装步骤**:因为用户需要附带PostgreSQL安装方法。 3. **pgvector安装步骤**:包括克隆、编译、启用等。 4. **验证安装**:如何确认安装成功。 5. **生成相关问题**:在最后添加相关问题。 确保使用中文。 步骤细节(基于引用): - PostgreSQL安装: - 下载PostgreSQL 14.0安装包。 - 增加用户postgres。 - 解压安装。 - pgvector安装: - 从GitHub克隆仓库。 - 使用make和make install编译安装。 -PostgreSQL中启用扩展:CREATE EXTENSION vector; 引用标识:在相关段落末尾添加[^1]或[^2]。由于引用是提供的,我可以使用它们作为来源。 生成相关问题: - 例如:如何测试pgvector?pgvector的优势是什么?等。 最终回答框架: - 标题或开头。 - 逐步安装指南。 - 代码块(如果需要)。 - 相关问题。 避免数学表达式,除非必要。用户查询中没有数学内容,所以可能不需要。 确保LaTeX正确:如果用到数学,格式正确。 现在,构建内容。 </think> ### PostgreSQL与pgvector插件安装指南 以下基于可靠来源[^1][^2],我将逐步说明如何在Linux系统上安装PostgreSQL数据库及其向量数据插件pgvector。pgvector是一个高性能扩展,支持向量相似度搜索(如欧氏距离计算:$d(\mathbf{a}, \mathbf{b}) = \sqrt{\sum_{i=1}^n (a_i - b_i)^2}$),常用于AI和机器学习场景。安装过程包括PostgreSQL基础安装和pgvector插件编译启用,全程需root权限。 #### 步骤1: 安装PostgreSQL数据PostgreSQL是开源关系型数据库,pgvector依赖其运行。以PostgreSQL 14.0为例(兼容多数Linux发行版): 1. **下载安装包** 访问[PostgreSQL官网](https://www.postgresql.org/download/)下载源码包(如`postgresql-14.0.tar.gz`),或使用包管理器: ```bash # Ubuntu/Debian sudo apt update sudo apt install postgresql postgresql-contrib ``` 在Red Hat/CentOS上,使用`yum install postgresql-server`。 2. **创建系统用户** PostgreSQL需要一个专用用户: ```bash sudo useradd postgres # 创建用户 sudo passwd postgres # 设置密码(可选) ``` 3. **解压与编译安装** 如果是源码安装: ```bash tar -xzvf postgresql-14.0.tar.gz cd postgresql-14.0 ./configure --prefix=/usr/local/pgsql # 指定安装路径 make sudo make install ``` 安装完成后,初始化数据库: ```bash sudo /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data sudo /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start ``` 4. **验证PostgreSQL** 检查服务状态: ```bash sudo systemctl status postgresql # 或使用 ps aux | grep postgres ``` 连接数据库: ```bash sudo -u postgres psql -c "SELECT version();" # 应显示版本信息 #### 步骤2: 安装pgvector插件 pgvector为PostgreSQL添加向量存储和相似度搜索功能,支持高效近似最近邻(ANN)算法。 1. **克隆源码** 从GitHub获取pgvector仓库: ```bash git clone https://github.com/pgvector/pgvector.git cd pgvector ``` 2. **编译与安装** 使用make工具编译插件: ```bash make # 编译 sudo make install # 安装到PostgreSQL扩展目录 ``` 如果报错(如缺少头文件),请安装依赖: ```bash sudo apt install build-essential postgresql-server-dev-14 # Ubuntu示例 ``` 3. **在PostgreSQL中启用扩展** 启动pgsql命令行并创建扩展: ```bash sudo -u postgres psql # 进入交互式终端 ``` 在psql终端内执行: ```sql CREATE EXTENSION vector; -- 启用pgvector SELECT * FROM pg_extension WHERE extname = 'vector'; -- 验证安装,应返回扩展信息[^2] ``` 4. **测试向量功能** 创建一个向量表并计算相似度: ```sql CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3)); INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'); SELECT id, embedding <-> '[3,1,2]' AS distance FROM items ORDER BY distance LIMIT 1; -- 输出最近邻结果(距离公式:$\|\mathbf{a} - \mathbf{b}\|$) ``` #### 常见问题解决 - **安装失败**:确保gcc、make和PostgreSQL开发包已安装(如`postgresql-server-dev-xx`)。 - **权限错误**:使用`sudo -u postgres`运行命令,避免权限冲突。 - **扩展未加载**:检查PostgreSQL日志(`/var/log/postgresql/*.log`)。 安装完成后,您可以使用pgvector存储和查询高维向量数据(例如,在推荐系统或图像检索中)。更多配置详见[pgvector官方文档](https://github.com/pgvector/pgvector)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值