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

关于MogDB中的虚拟索引

作为曾经的Oracle资深使用者,对于Oracle 11gR2版本推出的invisible Index感觉一直很良好;因为这对于大部分情况下做优化是比较友好的。实际上MogDB2.0版本中也提供了类似的功能,下面我们来进行简单测试。首先我们创建一个测试表用来验证MogDB的虚拟索引功能:

[omm@test26 ~]$ gsql -p26000 -d enmotech -Uroger

Password for user roger: gsql ((MogDB 2.0.1 build f892ccb7) compiled at 2021-07-09 16:12:59 commit 0 last mr )

Non-SSL connection (SSL connection is recommended when requiring high-security)

Type "help" for help.

enmotech=# create table test as select * from pg_settings;

INSERT 0 637
enmotech=# select count(1) from test;
count
-------
637
(1 row)


MogDB中对于虚拟索引的创建,需要借助相关函数来实现,如下:

enmotech=# select * from hypopg_create_index('create index on test(name)');
indexrelid | indexname
------------+-------------------------
24643 | <24643>ubtree_test_name
(1 row)


enmotech=# set enable_hypo_index = on;
SET
enmotech=#


通过hypopg_create_index 创建了基于test(name)的虚拟索引之后,我们打开会话级参数,让优化器能够识别索引。

接下来验证一下索引是否能够起作用:

enmotech=# explain select name,setting from test where name='checkpoint_timeout';
QUERY PLAN
-------------------------------------------------------------------------------------
Index Scan using <24643>ubtree_test_name on test (cost=0.00..8.27 rows=1 width=64)
Index Cond: (name = 'checkpoint_timeout'::text)
(2 rows)

enmotech=#


可以看到通过explain的结果来看,该查询语句能够使用Index scan,用到我们所创建的虚拟索引16395.

那么对于虚拟索引,是否会分配空间,占据文件系统大小呢?同样也可以使用mogdb提供的相关函数进行查询:

enmotech=# select * from hypopg_estimate_size(24643);
hypopg_estimate_size
----------------------
8192
(1 row)

enmotech=#


除此之后还提供了一些其他的函数:

hypopg_reset_index    清除所有虚拟索引

hypopg_drop_index    删除某个虚拟索引

hypopg_display_index 查看所有创建的虚拟索引


enmotech=# select * from hypopg_display_index();
indexname | indexrelid | table | column
-------------------------+------------+-------+--------
<24643>ubtree_test_name | 24643 | test | (name)
(1 row)

enmotech=#


虚拟索引创建后,属于实例级别、会话级别(其他会话也可以共享)。如果我们没有手工进行删除或者清除操作;那么当重启数据库实例之后,MogDB会自动删除所有的虚拟索引。

这里我们重启了mogDB集群之后,再登录数据库查看是否是这样:

enmotech=# \l
                              List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges 
-----------+-------+----------+-------------+-------------+-------------------
 enmotech  | roger | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +
           |       |          |             |             | omm=CTc/omm
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +
           |       |          |             |             | omm=CTc/omm
(4 rows)

enmotech=# select * from hypopg_display_index(); 
 indexname | indexrelid | table | column 
-----------+------------+-------+--------
(0 rows)


可以看到,MogDB实例重启之后,之前所创建的虚拟索引自动被清除。这实际上也MogDB AI功能方面的一个小点。非常赞!

最后修改时间:2022-02-28 21:17:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论