第四、第八章笔记
- 第4章 外部数据包装器
- FDW是如何执行的
- 总结
- 第八章 缓冲区管理器
- 8.1 概述
- 8.1.1 缓冲区管理器的结构
- 8.1.2 缓冲区标签(buffer_tag)
- 8.1.3 后端进程如何读取数据页
- 8.1.4 页面置换算法
- 8.1.5 刷写脏页
- 8.2 缓冲区管理器的结构
第4章 外部数据包装器
2003年,SQL标准中添加了一个访问远程数据的规范,称为SQL外部数据管理(SQL/MED)。PostgreSQL在9.1版本开发出了FDW,实现了一部分SQL/MED中的特性。
在SQL/MED中,远程服务器上的表被称为外部表(Foreign Table)。 PostgreSQL的外部数据包装器(FDW) 使用与本地表类似的方式,通过SQL/MED来管理外部表。
安装完必要的扩展并配置妥当后,就可以访问远程服务器上的外部表了。 例如假设有两个远程服务器分别名为postgresql和mysql,它们上面分别有两张表:foreign_pg_tbl和foreign_my_tbl。 在本例中,可以在本地服务器上执行SELECT查询以访问外部表,如下所示。
localdb=# -- foreign_pg_tbl 在远程postgresql服务器上
localdb-# SELECT count(*) FROM foreign_pg_tbl;
count
-------
20000
localdb=# -- foreign_my_tbl 在远程mysql服务器上
localdb-# SELECT count(*) FROM foreign_my_tbl;
count
-------
10000
FDW是如何执行的
1、分析器为输入的SQL创建一颗查询树。
2、计划器(或执行器)连接到远程服务器。
3、如果启用了use_remote_estimate选项(默认关闭),则计划器将执行EXPLAIN命令以估计每条计划路径的代价。
4、计划器按照计划树创建出纯文本SQL语句,在内部称该过程为逆解析(deparesing)。
5、执行器将纯文本SQL语句发送到远程服务器并接收结果。
总结
访问远程服务器的数据表的Sql语句与访问本地服务器数据表的Sql语句并无区别,主要区别体现在查询编译的过程中,会生成新的SQL语句传给远程服务器执行后得到数据,最后返回本地服务器进行运算。
第八章 缓冲区管理器
缓冲区管理器(Buffer Manager)管理着共享内存和持久存储之间的数据传输,对于DBMS的性能有着重要的影响。PostgreSQL的缓冲区管理器十分高效。
8.1 概述
本章介绍了PostgreSQL的缓冲区管理器。第一节概览了缓冲区管理器,后续的章节分别介绍以下内容:
- 缓冲区管理器的结构
- 缓冲区管理器的锁
- 缓冲区管理器是如何工作的
- 环形缓冲区
- 脏页刷写
8.1.1 缓冲区管理器的结构
PostgreSQL缓冲区管理器由缓冲表,缓冲区描述符和缓冲池组成,这几个组件将在接下来的小节中介绍。 缓冲池(buffer pool)层存储着数据文件页面,诸如表页与索引页,及其相应的自由空间映射和可见性映射的页面。 缓冲池是一个数组,数据的每个槽中存储数据文件的一页。 缓冲池数组的序号索引称为buffer_id。
8.1.2 缓冲区标签(buffer_tag)
PostgreSQL中的每个数据文件页面都可以分配到唯一的标签,即缓冲区标签(buffer tag)。 当缓冲区管理器收到请求时,PostgreSQL会用到目标页面的缓冲区标签。
8.1.3 后端进程如何读取数据页
1、当读取表或索引页时,后端进程向缓冲区管理器发送请求,请求中带有目标页面的buffer_tag。
缓冲区管理器会根据buffer_tag返回一个buffer_id,即目标页面存储在数组中的槽位的序号。如果请求的页面2、没有存储在缓冲池中,那么缓冲区管理器会将页面从持久存储中加载到其中一个缓冲池槽位中,然后再返回该槽位的buffer_id。
3、后端进程访问buffer_id对应的槽位(以读取所需的页面)。
当后端进程修改缓冲池中的页面时(例如向页面插入元组),这种尚未刷新到持久存储,但已被修改的页面被称为脏页(dirty page)。
8.1.4 页面置换算法
当所有缓冲池槽位都被占用,且其中未包含所请求的页面时,缓冲区管理器必须在缓冲池中选择一个页面逐出,用于放置被请求的页面。 在计算机科学领域中,选择页面的算法通常被称为页面置换算法(page replacement algorithms),而所选择的页面被称为受害者页面(victim page)。
8.1.5 刷写脏页
脏页最终应该被刷入存储,但缓冲区管理器执行这个任务需要额外帮助。 在PostgreSQL中,两个后台进程:检查点进程(checkpointer)和后台写入器(background writer)负责此任务。