关于 openGauss 中的虚拟索引

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

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

INSERT 0 637

enmotech=# select count(1) from test;

count

637

(1 row)

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

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.

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

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_estimate_size(24643);

hypopg_estimate_size

8192

(1 row)

enmotech=#

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

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

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)

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

关于openGauss中的虚拟索引的更多相关文章

  1. 在优化SQL语句中使用虚拟索引

    定义:虚拟索引(virtual index) 是指没有创建对应的物理段的索引. 虚拟索引的目的:是在不损耗主机CPU,IO,磁盘空间去实际创建索引的情况下,来判断一个索引是否能够对SQL优化起到作用. ...

  2. Oracle虚拟索引,大表或生产环境下预估索引效果的好东西

    在数据库优化过程中,索引的重要性是不言而喻的,但是在我们进行性能调整过程中, 一个索引是否能够被使用到,在索引创建之前是存在不确定性的. 而创建索引又是一个代价很高的操作,尤其是数据量很大的情况下,在 ...

  3. Oracle之虚拟索引

    一.引言 DBA在日常维护管理数据库进行低性能SQL分析时,有时候需要通过创建索引对SQL进行优化,但有些时候我们创建的索引是否能用到?这个只能创建以后才能看出效果,但是在实际工作中,特别是对大表创建 ...

  4. ORACLE虚拟索引(Virtual Index)

    ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...

  5. Oracle性能调优之虚拟索引用法简介

    本博客记录一下Oracle虚拟索引的用法,虚拟索引是定义在数据字典中的伪索引,可以说是伪列,没有修改的索引字段的.虚拟索引的目的模拟索引,不会增加存储空间的使用,有了虚拟索引,开发者使用执行计划的时候 ...

  6. 【索引】Oracle之不可见索引和虚拟索引的比对

    [索引]Oracle之不可见索引和虚拟索引的比对    Oracle之不可见索引 :http://blog.itpub.net/26736162/viewspace-2124044/ Oracle之虚 ...

  7. 0103MySQL中的B-tree索引 USINGWHERE和USING INDEX同时出现

    转自博客http://www.amogoo.com/article/4 前提1,为了与时俱进,文中数据库环境为MySQL5.6版本2,为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于My ...

  8. SQLSERVER中如何忽略索引提示

    SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引, ...

  9. ubuntu /etc/network/interfaces 中配置虚拟链路

    ubuntu /etc/network/interfaces 中配置虚拟链路 平常做一些关于网络的测试时,像一些需要在二层上运行的功能,一个网卡不足够的情况下,可使用 ip link 工具加一些虚拟的 ...

  10. solr与.net系列课程(八)solr中重跑索引的注意事项

    solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来 ...

随机推荐

  1. 【Azure Redis 缓存 Azure Cache For Redis】Redis支持的版本及不同版本迁移风险

    问题描述 1. Azure Redis缓存支持的版本包括4.0以及6.0(预览) 这种情形下,可以使用PaaS服务提供的 Azure Redis 缓存(4.0版本).Azure Redis对6.0的支 ...

  2. 【Azure 事件中心】使用Apache Flink 连接 Event Hubs 出错 Kafka error: No resolvable bootstrap urls

    问题描述 参考Github上 Event Hub的示例代码(Using Apache Flink with Event Hubs for Apache Kafka Ecosystems : https ...

  3. 容器与 Pod

    现在 Docker 的流行程度越来越高,越来越多的公司使用 Docker 打包和部署项目.但是也有很多公司只是追求新技术,将以前的单体应用直接打包为镜像,代码.配置方式等各方面保持不变,使用 Dock ...

  4. linux-debian-把用户加入root组

    使用vim进入 /etc/sudoers   打开这个文件(或者 vi)也行 修改数据: 敲击键盘上个的  i 就可以键入字符了, 在root = ALL(ALL:ALL) ALL  的下面敲击 用户 ...

  5. stm32文件系统读写操作调试总结

    一 问题 最近使用到了文件系统的读写,中间遇到了一些问题值得深思.   二 源码解析 创建文件: FRESULT res; do { sprintf(filename,"/sensor_si ...

  6. Java Springboot javax.net.ssl.SSLException: Connection reset解决方案

    接口设置HTTPS TLS1.2后,随机出现SSLException: Connection reset报错: javax.net.ssl.SSLException: Connection reset ...

  7. Electron 开发过程中主进程的无法看到 console.log 输出怎么办

    开发过程中命令行工具(powershell.terminal)内无法看到 console.log 输出 Eelectron 的在开发过程中主进程 NodeJS 内往往需要 console.log 来进 ...

  8. isPrimitive()方法和包装类

    java.lang.Class.isprimitive()是说:确定指定的Class对象是基本类型,其返回是个boolean值,true代表你指定的这个Class对象是基本类型,false代表这个Cl ...

  9. 利用kali自带的msfvenom工具生成远程控制软件

    一.首先还是得打开postgresql service postgresql start 然后让我们看看它有哪些功能 部分参数 -p 选择一个载荷,或者说一个模块吧. -i 载荷列表 -f 生成的文件 ...

  10. 利用Python 去重聚合Excel数据并对比两份数据的差异

    问题背景 在数据处理过程中,常常需要将多个数据表进行合并,并进行比对,以便找出数据的差异和共同之处.本文将介绍如何使用 Pandas 库对两个 Excel 数据表进行合并与比对,并将结果输出到新的 E ...