为什么倒排表的分块方案采用固定数目(fixed number)的,而不是固定大小(fixed size)的?
解答:
CPU流水线的有效性
FN方案中,由于确定数目,例如128,则压缩和解压很容易做循环展开的优化,没有分支指令。当然倒排表的最后可能不会正好是128,需要padding一些dummy的docid,但这种存储损耗,如果有100K词条,每个词条增加127个padding的,每个padding按3个字节(docid,frequency, hitlist)代价计算,则不过10M而已,和解压快速的收益看非常小。
FS方案中,压缩和解压的过程中要反复判断是否跨块,因此增加的if-then-else这样的branch指令,使得CPU指令预测可能出现错误而导致流水线停滞(通常for循环中是需要避免分支指令的,后面PFOR-DELTA的优化再详细讨论)。
从存储的有效性上看
FN方案,存储致密,只是需要在最后一个block上padding一些dummy的docid。
FS方案,如果考虑到每个固定块中需要存放docidlist,freqency, hitlist的话,那么极容易出现跨块,而使得每个block的尾部空间都会有损耗,这个代价是极大的,因此FS的这种方案就不易存放hitlist,给设计带来了局限。
压缩效果的可控性
FN方案,文档数固定,压缩可控,文档数太少压缩效果差,文档数太多解压效率低,不容易出现skip的情况。
FS方案,大小很难固定,固定了大小,文档数也很难控制,文档数多少和压缩效果紧密联系。
当然FS的方案也不是一无是处,由于计算偏移容易(均为字节地址),而FN的方案不可避免的使用比特地址。此前的博文中已有讨论,不再赘述。
为什么说PFORDELTA的压缩方法,压缩效果好,解压速度快?
解答:
关于流水线角度的分析,请参见:http://blog.csdn.net/pennyliang/archive/2010/09/25/5905691.aspx
成片解压,计算量低
PFORDELTA事实上只是对exception进行了特别处理,而其余小于threshold的数直接按照二进制的形式存取,因此读取一个字节就可以获得一片docid。同时计算时只有加法,没有乘除法,虽然其余的编码方式由于除的均为2的倍数,因此可以通过移位来优化,但从计算的复杂度看,PFORDELTA还是非常有优势,因为看上去其实并没有进行什么“压缩计算”一样。
在docid重排(reordering)的情况下,PFORDELTA的提升
docid重排问题比较复杂,这涉及到很好的支持docid的clustering,又要支持early termination(更好的docid要往前排),同时还必须这种重排方法要比较简便,分配的docid要完全致密,没有人为的gap。
b值较小情况,block size = 128,而b低于5的情况下的优化
PFORDELTA算法依赖于b值,而b值过小的情况下,无法在entry中存放下一个exception的位置的偏移量,这种情况下需要特别的优化。
下一篇博客进行深入探讨docid重排,小b值设定情况下的优化对pfor-delta压缩的改进。
推荐阅读:
答索引构造一问:http://blog.csdn.net/pennyliang/archive/2010/07/30/5776140.aspx
分享到:
相关推荐
- **分阶段索引构造**:将索引构建任务划分为多个阶段,逐步完成索引构建,减少一次性资源需求和对系统的影响。 - **渐进式可用性**:在索引构建过程中逐步提高索引的可用性,使用户可以尽早使用部分已完成构建的...
数据结构构造索引字典设计是指使用C++语言构建一个索引字典的系统,用于任意书籍构造索引字典。这个系统的主要功能是从一个文本文件中读入内容,然后将单词从中分离出来并记录出现次数,最后将处理结果写入另一个...
### 一种图像稀疏贪婪索引字典的构造方法 #### 摘要与背景介绍 随着信息技术的发展,稀疏理论作为一种重要的数据处理方法,在压缩传感、盲源分离、图像修复等多个领域得到了广泛应用。该理论的核心思想是用尽可能...
#### 一、索引的基本概念 在数据库中,索引是一种特殊的文件结构,它的主要目的是为了提高数据检索的速度。索引通过创建一种数据结构(例如B树)来实现这一点,这种结构允许数据库管理系统能够快速定位到数据所在的...
在Oracle数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区策略相匹配,分区索引可以分为两大类:本地索引(Local Index)和全局索引(Global ...
数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍聚集索引和非聚集索引的概念、区别、使用场景和误区。 ...
使用CREATE INDEX语句可以在一个已有表上创建索引,一个表可以创建多个索引。 语法格式: CREATE [UNIQUE | FULLTEXT] INDEX 索引名 ON 表名(列名[(长度)] [ASC | DESC],...) 说明: UNIQUE:表示创建的是唯一性索引 ...
如果索引实在太大,如几十个 G 的索引,创建一次或者重组一次需要耗费很长的时间。在这种情况下,可以采用一些特殊的方法来提高速度,如采用大的排序区,并行操作等等。 例如: ```sql alter session set sworkarea...
LabVIEW 中的数组索引详细讲解 ...LabVIEW 中的数组索引是一个重要的知识点,它可以帮助开发者快速完成数组的处理和分析。因此,在学习 LabVIEW 时,需要认真地学习和掌握自动索引功能的知识点和应用场景。
在数据库中,索引是一种至关重要的机制,它极大地提高了查询效率。本文将深入探讨数据库中的非聚集索引、聚集索引以及索引模式的概念,并分析它们之间的区别。 首先,让我们了解一下**非聚集索引**。非聚集索引在...
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...
这种索引的键值直接对应于数据行,意味着一个表只能有一个聚集索引。如果表没有聚集索引,数据将以无序的“堆”形式存储。相反,非聚集索引则独立于数据行,包含了索引键值和指向数据行的指针,允许一张表有多个非...
空间索引是GIS(地理信息系统)领域中一个关键的概念,主要解决的是在海量空间数据中高效检索和操作的问题。在数据库管理系统(DBMS)中,索引被广泛用于加速数据查询,而空间索引则是针对空间数据的特殊索引类型。 ...
#### 一、索引的基础概念及作用 索引在数据库管理系统中扮演着至关重要的角色,它能够显著提高查询效率,减少系统的响应时间。简单来说,索引就像是图书的目录,帮助用户更快地定位到所需的信息。在数据库领域,...
- **B*树聚簇索引**:一个键值对应一个数据块,包含该键值相关的一组行。 - **降序索引**:数据按照降序排列,有助于优化ORDER BY子句的反向排序查询。 - **反向键索引**:用于解决连续值导致的索引块竞争问题,...
索引调整向导是一种工具,通过使用查询优化器来分析查询任务的工作量,向有大量工作量的数据库推荐一种最佳的索引混合方式,以加快数据库的查询速度。 索引和索引调整向导具有以下特点: * 索引可以加快数据库的...
例如,在一本科技类图书中,可以将一级索引设为大类别(如“计算机科学”),二级索引为子类别(如“编程语言”),三级索引为具体语言(如“Python”),四级索引则可以是特定的函数或概念(如“Python的for循环”...
数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面的知识点。 索引的概念和优点...
一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...
提出了索引fibration及其真值与内涵函子的定义,构造了索引与代数范畴,利用折叠函数与伴随函子等工具构造了索引范畴中一类相对复杂的索引归纳数据类型,辅以实例进行了简要分析,并通过相关工作的论述指出了...