暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES 模板 支持GiST索引

原创 数据猿 2024-01-04
175


金仓数据库KingbaseES 支持GiST索引

关键字:

KingbaseES、 索引、GiST、人大金仓

GiST介绍

通用搜索树(Generalized Search Tree)。它是一种平衡的,树状结构的访问方法。在系统中起一个基础模版作用,可以用它实现任意索引模式。 B-TREE 、R-TREE和许多其它的索引模式都可以用 GiST 实现。

GiST允许一种用户自定义的数据类型和合适的访问方法一起开发,并且是由该数据类型范畴里的专家,而不是数据库专家开发。GiST将方法和数据统一起来,就能适合各种不同的索引要求。当然,速度会比已经明确方法、且经过不断优化的索引慢一点点。

GiST特点说明:

HASH索引只支持等于操作。B-TREE索引需要指定大于,小于,等于这几个函数。R-TREE索引需要指定在左边,在右边,包含这几个操作。

可以扩展的 B-TREE 和 R-TREE意味着可以在任意你需要的数据类型上建立 B-TREE 或者 R-TREE 。但是B-TREE只支持范围谓词 ((<,=,>), 而 R-TREE 只支持 n-D (n-维)范围查询(包含,被包含,相等)。所以,如果你用 B-TREE 索引了一个图象集,那么你就只能发出类似“图象 x 和 图象 y 相等吗”, “图象 x 是不是比图象 y 小” 和 “图象 x 是否大于图象 y”?这样的查询。

GiST组织结构:

GistNSN的用处:用于判断一个节点是否分裂。Btree中用SearchKey和HighKey之间的比较实现类似的功能。

页头中的lsn:该节点最后一次被修改的时间。页尾中的nsn:该节点被创建的时间。一棵处于一致性状态的树,父节点的lsn一定比子节点的nsn要大。

注意:如果父节点的lsn比该节点的nsn要小,则该节点是分裂节点。

GiST创建:

kes支持gist索引功能,支持具有搜索语义的数据类型,如文本、数值、几何类型等。操作如下:

1、数值类型

drop extension if exists btree_gist;

create extension btree_gist;

drop table if exists tt_int;

create table tt_int(c int);

create index tt_int_idx on tt_int using gist(c);

2、文本类型

drop extension if exists btree_gist;

create extension btree_gist;

drop table if exists tt_text;

create table tt_text(c text);

create index tt_text_idx on tt_text using gist(c);

insert into tt_text select 'test'||i from generate_series(0,100000) as i;

3、点类型

drop table if exists tt_point;

create table tt_point(c point);

create index tt_point_idx on tt_point using gist(c);

insert into tt_point select point(1*i, 1*i) from generate_series(0,1000000) as i;

GiST的空间回收:

分vacuum和vacuum full两种情况。

  1. vacuum时先做叶子页面内dead tuple对应的索引项的删除,再将空闲空间返回DMS,并记录入FSM。通常,因为vacuum只作页内清理,即使整个页面都是空的,也不将页面标识为空页面。所以,几乎没有可以返回给DMS的空间。
  2. Vacuum full之前持AccessExclusiveLock锁,做空页面的清理。

和vacuum相关的操作主要有三个: gistbulkdelete、gistVacuumUpdate、gistvacuumcleanup。

  • gistbulkdelete封锁顺序和封锁粒度与插入元组时类似。都是逐页加锁,逐页放锁。先加读锁,遇到叶子节点时再释放读锁,加写锁。并做一致性检查。gistbulkdelete的结果是将dead tuple对应的索引项删除。并在页面内打上有删除元组标识(为父节点调整索引值使用)。gistbulkdelete扫描的顺序是从根节点开始,按照逻辑顺序扫描。
  • gistVacuumUpdate 之前上AccessExclusiveLock锁。只在vacuum full时做。主要工作是将空页面从树中删除,并修改非叶子节点对应的索引项。意味着树会变矮。
  • Gistvacuumcleanup按IAM中的页面信息顺序,扫描页面,收集空闲页面信息,记入deallocinfo中。再将空闲空间返回DMS,并记录入FSM。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论