PostgreSQL
文章平均质量分 64
冯岳松
这个作者很懒,什么都没留下…
展开
-
事务的隔离性
SQL标准规定了四个隔离级别。这些级别是由在并发事务执行过程中可能或不可能发生的异常所定义的。因此,在谈论隔离级别时,我们必须从异常入手。我们应该记住,标准是一个理论性的构造:它影响着实践,但实践仍然在很多方面与它相背离。这也是为什么这里所有的例子都是假设性的。在处理银行账户的交易时,这些例子是一目了然的,但我不得不承认,它们与真正的银行业务没有任何联系。有趣的是,实际的数据库理论也与标准相背离:它是在标准被采用后才发展起来的,而实践已经远远领先。翻译 2022-09-16 12:28:32 · 136 阅读 · 0 评论 -
PostgreSQL自定义文本检索分词规则
由于是为文本检索而设计,所以默认的分词规则和字典都是按照自然语言的规则来实现。但对于以上需求,已经不是文本检索,而是为了使用文本检索+倒排索引实现自己的查询需求,所以分词器也需要自定义。PostgreSQL提供了丰富的字典自定义方法,可以很轻松地对字典的规则进行自定义。,仅使用了空格作为token的分割符,所有token都是一种类型,完成了需求。,将会影响到正常文本检索的分词逻辑,所以使用插件的方式新增一个分词规则。接下来自定义一个分词器,实现自定义规则拆分token的功能。......原创 2022-08-18 17:32:01 · 966 阅读 · 0 评论 -
PostgreSQL文本搜索(七)——自定义配置
有几个预定义的文本搜索配置可用,你也可以很容易地创建自定义配置。为了便于管理文本搜索对象,有一组SQL命令可用,还有几个psql命令可以显示文本搜索对象的信息。所需的所有选项:使用词法分析器将文本分解为token,以及使用词典将每个token转化为lexeme。指定了默认配置的名称,如果省略了一个明确的配置参数,文本搜索函数就会使用这个配置。我们将使用一个PostgreSQL专用的同义词列表,并将其存储在。的调用都需要一个文本搜索配置来执行其处理。下一步是设置会话使用新的配置,该配置是在。...原创 2022-08-18 16:19:52 · 720 阅读 · 0 评论 -
PostgreSQL文本搜索(六)——词典
词典用于消除在搜索中不应考虑的词(停顿词),并使词规范化,以便同一词的不同派生形式能够匹配。一个成功规范化的词被称为lexeme(词位、词素)。除了提高搜索质量之外,规范化和删除停顿词可以减少文档的tsvector的大小,从而提高性能。规范化并不总是具有语言学意义,通常取决于实际应用决定的语义。TSL_FILTERPostgreSQL为许多语言提供预定义的词典。也有几个预定义的模板,可以用来创建带有自定义参数的新词典。下文描述了每个预定义的词典模板。...原创 2022-08-18 11:39:38 · 608 阅读 · 0 评论 -
PostgreSQL文本搜索(五)——词法分析器
文本搜索词法分析器负责将原始文档文本分割成token,并确定每个token的类型,其中可能的类型集合由词法分析器本身定义。注意分析器根本不修改文本,它只是识别合理的词的边界。由于这种有限的范围,对特定应用的自定义分析器的需求比对自定义字典的需求要少。目前PostgreSQL只提供了一个内置的分析器,它已经被发现对广泛的应用很有用。仅包含基本ASCII字母的词被报告为一个单独的token类型,因为有时区分它们是很有用的。分析器对"字母"的概念是由数据库的区域设置决定的,特别是。内置的分析器被命名为。...原创 2022-08-18 09:14:46 · 221 阅读 · 0 评论 -
PostgreSQL文本搜索(二)——表和索引
上一节的例子说明了使用简单的常量字符串进行全文匹配。本节展示了如何搜索表数据,或选择使用索引。原创 2022-08-17 10:41:56 · 498 阅读 · 0 评论 -
PostgreSQL文本搜索(一)——简介
文档是全文检索系统中的检索单位,例如一篇杂志文章或一封电子邮件。文本搜索引擎必须能够解析文档并存储词位(关键词)与它们的父文档的关联。之后,这些关联被用来搜索包含查询词的文档。对于PostgreSQL中的搜索,一个文档通常是数据库表中的一行文本字段,或者可能是这种字段的组合(连接),可能存储在几个表中或动态地获得。换句话说,一个文档可以由不同的部分构成索引,它可能不会作为一个整体存储在任何地方。......原创 2022-08-15 14:09:12 · 1609 阅读 · 0 评论 -
PostgreSQL内存上下文
内存的访问速度至少是磁盘的数十万倍,所以通常读写磁盘所用的时间决定了数据库操作的总时间,而内存的访问时间可以忽略不计。除此之外,内存管理还是整个数据库系统的桥梁,每一个模块都会使用到内存进行函数运行、缓冲、消息传递等,内存管理对于数据库来说十分重要。一个内存上下文就相当于一个进程的内存环境,每个进程的内存上下文组成一个树行结构,其根节点为。在每个内存块中可以进一步分配内存,产生的内存片段叫做内存片(AllocChunk),包括一个头部和数据区域,为内存片的头部,数据区域则紧跟在头部信息之后分配,通过。...原创 2022-08-09 16:29:26 · 518 阅读 · 0 评论 -
PostgreSQL插件开发
PostgreSQL中许多控制信息都是以系统表的形式来管理,这个特点决定了PostgreSQL比其他数据库更容易进行内核扩展。PostgreSQL还提供了丰富的数据库内核编程接口,允许开发者以插件的形式将自己的代码融入内核。PostgreSQL插件开发非常简单,下面举一个例子,开发一个随机测试数据生成器。...原创 2022-08-01 14:18:16 · 1081 阅读 · 0 评论 -
PostgreSQL可见性映射表(VM)和VACUUM操作
VM文件仅在快速清理中被用到,对于FULLVACUUM,由于要执行跨页清理等复杂操作,还是需要扫描整个表文件,此时VM作用不大。当前VM文件是一个提示(hint)来加快VACUUM的速度,即使损坏了VM文件,仅仅会导致VACUUM忽略那些需要清理的页面,但元组的可见性依然不变,所以对数据不会产生任何影响。当页中所有的元组对于当前事务都是可见的,VM中对应的位为1,表示没有无效元组。当页在VM中对应的标志为是1时,VACUUM会忽略对应的页,大大提高VACUUM的效率。每个VM文件的页中,可用的字节为。...原创 2022-08-01 10:25:19 · 661 阅读 · 0 评论 -
PostgreSQL 空闲空间映射表(FSM)
当我们需要插入新的元组时,需要优先将元组放到已有页内的空闲空间内,以节约存储空间。但我们怎么知道哪个页中有空闲空间、空闲空间的大小是否足够存放新的元组呢?如果没有其他任何技术,则需要遍历页、直到找到足够的空闲空间用于插入新元组,这样开销将会非常大。为了解决这个问题,PostgreSQL使用了空闲空间映射表(FSM)来记录所有表文件的空闲空间信息。为了更快的查找,FSM文件也不是使用数组存储每个页的空闲空间,而是使用了一个三层树结构。第0层和第1层是辅助层,第2层用于实际存放各表页中的空闲空间字节位。...原创 2022-08-01 10:04:23 · 386 阅读 · 0 评论 -
PostgreSQL插入大量数据:pg_testgen插件
在进行数据库开发、测试时,新建表之后,时常想自己插入数据,但十分麻烦。pg_testgen插件可以产生大量随机数据,方便进行数据库开发测试。原创 2022-07-28 18:39:21 · 614 阅读 · 0 评论 -
PostgreSQL VFD——虚拟文件描述符
VFD的原理类似于进程池、内存池等池化技术,当进程申请打开一个文件时,总能分配一个虚拟的文件描述符,是真实文件描述符的一个上层封装。VFD使用LRU(最近最少使用)池来管理所有已经打开文件,当进程打开的文件个超过操作系统限制时,也可以申请一个新的VFD,从LRU链表中替换最长时间未使用的VFD并关闭相应的实际文件描述符。VFD也会管理一个空闲VFD链表,方便获取当前空闲的VFD。在操作系统中,每当一个进程打开一个文件,系统就会为该文件分配一个唯一的文件描述符,在Linux系统中是一个。...原创 2022-07-18 09:49:58 · 316 阅读 · 0 评论 -
PostgreSQL表和元组的组织方式
每一个tuple存储一条数据记录,从数据页底部开始向前依次存储,这些堆元组的地址由一个4B大小的行指针所指向。这些行指针内还保存了堆元组的长度,并形成一个简单的数组,扮演元组索引的角色。如需要定位某数据表中的一条记录,只需要知道该记录在堆文件中的页号和页面内的行指针偏移号即可。除此之外,每个页面的起始位置有大小为24B的页头,保存页面相关的元数据。行指针和尾部的tuple之间是该页面的空闲空间...原创 2022-07-15 15:42:16 · 433 阅读 · 0 评论 -
行存与列存——数据表的存储方式
行存与列存——数据表的存储方式原创 2022-07-14 14:29:07 · 1067 阅读 · 0 评论 -
页大小——数据库文件IO的基本单位
页大小——数据库文件IO的基本单位原创 2022-07-14 14:27:39 · 1031 阅读 · 0 评论