当修改元组属性,执行重建索引等操作时, 特别是当进行多次更新,删除操作时,
磁盘上会出现很多无效的元组, 占据了很多磁盘空间并且导致系统性能下降,
这时就需要VACUUM操作清除掉这些”垃圾”.
很明显, 那些经常更新或者删除元组的表需要比那些较少更新的表清理的更频繁一些.
PG开启了一个辅助进程AutoVacuum来执行自动清理工作.
在PG中, 每个事务(包括其子事务)在执行时, 需要跟踪其占用的内存资源.
例如, 需要跟踪一个缓冲区的pin锁或者一个表的锁资源,
以保证在事务结束或失败的时候能够被及时释放.
PG中使用ResourceOwner对象来对资源集中进行跟踪.
我们也称之为ResourceOwners资源跟踪器.
ResourceOwner主要记录哪些资源类型ResourceOwner记录了大多数事务过程中使用到的资源, 主要包括:
父节点,子节点的ResourceOwner指针, 用于构成资源跟踪器之间的树状结构.
占用的资源共享缓冲数组和持有的缓冲区pin锁个数.
Cache的引用次数以及占用的Cache中存储的数据链表,包括CatCache,
RelCache以及缓存查询计划的PlanCache.
TupleDesc引用次数以及占用的TupleDesc数组.
Snapshot(见7.10.3节)引用次数以及占用的Snapshot数组.
索引 什么是索引索引是指按表中某些关键属性或表达式建立元组的逻辑顺序,
它是由一系列元组的标识号组成的一个列表.
使用索引可以快速访问表中的特定元组, 被索引的表称为基表.
索引改变元组了吗索引并不改变表中元组的物理顺序, 索引技术会将对于元组的逻辑排序保存在索引文件中.
索引是如何更新的基表文件中的元组被修改或删除时, 索引文件会自动更新以保证能够准确的找到新的数据.
任何一个成熟的数据库都离不开索引的支持, PG当然也不例外.
PG中的索引类型有哪些在PG8.4.1中目前支持的索引有: B-Tree索引, Hash索引, GiST索引和GIN索引.
延伸-说一下数据库有哪些索引类型,有什么优缺点?https://blog.csdn.net/qq_39944869/article/details/100532144
4.1 概述 举例说明索引的好处假设有下面这样一个表:
create table student_in_all_countries (
id integer,
name varchar
);
需要大量使用类似下面这样的语句进行查询:
select name from student where id=007;
通常, 数据库系统需要一行一行地扫描整个student表以寻找所有匹配的元组.
如果表student的规模很大(如上student_in_all_countries, 全世界所有国家的学生数量,
恐怕有几亿个), 但是满足where条件的只有少数几个(可能是0个或1个),
那么这种顺序扫描的性能就比较差了(注意: 元组在数据库物理存储并不是顺序的,
而是按照创建顺利来的, 所以上面id=007, 有可能需要很大量的顺序扫描).
如果让数据库系统在id属性上维护一个索引用于快速定位匹配的元组,那么数据库系统只需要在搜索树中查找少数的几层就可以找到匹配的元组,
这将大大提高数据查询的性能.
类似的, 在数据库中进行更新,删除操作时也需要先找到要操作的元组,
利用索引同样可以提升这些操作的性能.
PG8.4.1中一共提供了5种索引方式: 唯一索引, 主键索引,
多属性索引,部分索引,表达式索引以及4中索引类型: B-Tree, Hash, GiST, GIN.
每种索引类型都分别适合某些特定的查询类型, 因为他们用了不同的索引结构.
create index命令可以用来创建索引, 默认情况下该命令将创建一个B-Tree索引.
什么是”从属索引”PG里的所有索引都是”从属索引”, 也就是说, 索引在物理上与它描述的表文件分离.
索引在数据字典哪里记录着作为一种数据库对象, 每个索引都在pg_class表里面有记录,
一个索引的内部结构与该索引的访问方法(索引类型)相关.
一个索引的内部结构与该索引的访问访求(索引类型)相关.
PG所有索引访问方法是通过什么来组织的, 如何理解?PG中所有索引访问方法都通过页面来组织索引的内部结构,
这样可以使用存储管理器提供的接口来访问索引.
所有现有的索引访问方法都使用3.2.1节描述的标准的页面布局.
索引的本质是什么