MOGDB/openGauss 索引推荐及虚拟索引

索引推荐

在 ORACLE 的优化中,可能大家有接触过 SQL Tuning Advisor(SQL 调优顾问,STA),类似的 MOGDB/openGauss 的索引推荐(Index-advisor)功能也可以对你的查询进行分析,并提出合理的创建索引的建议。ORACLE 的 STA 输出是以一种意见或者建议的形式,以及对每一项建议和期望效益的理由。该建议涉及对象的统计收集,新索引的创建,SQL 语句的重组,或 SQL 概要的创建。你可以选择该建议来完成 SQL 语句的调优。MOGDB/openGauss 的索引推荐(Index-advisor)在这也是比较类似,但可能结果不如 ORACLE 的 STA 的优化报告详尽。

如下为我对 MOGDB/openGauss 的索引推荐(Index-advisor)功能的使用测试,包括单条 SQL 查询索引推荐、Workload 级别索引推荐(针对一批 SQL 语句的索引推荐)等。

一、测试数据导入

postgres=# create database ysla;

CREATE DATABASE

postgres=# \c ysla

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

You are now connected to database "ysla" as user "omm".

ysla=# CREATE TABLE tab_ysl_1 (col1 int, col2 int, col3 text);

CREATE TABLE

ysla=# INSERT INTO tab_ysl_1 VALUES(generate_series(1, 3000),generate_series(1, 3000),repeat( chr(int4(random()*26)+65),4));

INSERT 0 3000

ysla=# ANALYZE tab_ysl_1;

ANALYZE

ysla=# CREATE TABLE tab_ysl_2 (col1 int, col2 int);

CREATE TABLE

ysla=# INSERT INTO tab_ysl_2 VALUES(generate_series(1, 1000),generate_series(1, 1000));

INSERT 0 1000

ysla=# ANALYZE tab_ysl_2;

ANALYZE

二、单条 SQL 查询索引推荐

如下面所示,用 gs_index_advise 函数即可使用索引推荐,结果中包含表和可以创建索引的列。

1.测试 where

ysla=# SELECT * FROM gs_index_advise('SELECT * FROM tab_ysl_1 WHERE col1 = 10');

table | column

-----------+--------

tab_ysl_1 | (col1)

(1 row)

2.测试 join

ysla=# SELECT * FROM gs_index_advise('SELECT * FROM tab_ysl_1 join tab_ysl_2 on tab_ysl_1.col1 = tab_ysl_2.col1');

table | column

-----------+--------

tab_ysl_1 | (col1)

tab_ysl_2 |

(2 rows)

3.测试多表

ysla=# SELECT * FROM gs_index_advise('SELECT count(*), tab_ysl_2.col1 FROM tab_ysl_1 join tab_ysl_2 on tab_ysl_1.col2 = tab_ysl_2.col2 WHERE tab_ysl_2.col2 > 2 GROUP BY tab_ysl_2.col1 ORDER BY tab_ysl_2.col1');

table | column

-----------+--------

tab_ysl_1 | (col2)

tab_ysl_2 | (col1)

(2 rows)

4.测试 order by

ysla=# SELECT * FROM gs_index_advise('SELECT *, col2 FROM tab_ysl_1 ORDER BY 1, 3');

table | column

-----------+--------

tab_ysl_1 |

(1 row)

ysla=# SELECT * FROM gs_index_advise('SELECT * FROM tab_ysl_1 WHERE col1 > 10 ORDER BY 1,col2');

table | column

-----------+--------

tab_ysl_1 |

(1 row)

5.测试过长字符串

ysla=# SELECT * FROM gs_index_advise('SELECT * FROM tab_ysl_1 where col3 in (''aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'',''bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'',''ccccccccccccccccccccccccccccccccccccccc'',''ddddddddddddddddddddddddddddddddddddddd'',''ffffffffffffffffffffffffffffffffffffffff'',''ggggggggggggggggggggggggggggggggggggggggggggggggggg'',''ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt'',''vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv'',''ggmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'')');

ERROR: index_advisor.cpp : 983 : The parameter destMax is too small or parameter count is larger than macro parameter SECUREC_STRING_MAX_LEN. The second case only occures in functions strncat_s/strncpy_s.

三、Workload 级别索引推荐

这种方式可以针对多条 SQL,可以将待优化的 SQL 写到文件里,通过脚本获得推荐索引。

脚本目录在安装目录的 bin/dbmind/index_advisor 下边,我的目录为

/opt/gaussdb/app/bin/dbmind/index_advisor/index_advisor_workload.py

将待优化的 SQL 放到文件里

[omm@node1 index_advisor]$ cat 1.sql

SELECT * FROM tab_ysl_1 WHERE col1 = 10;

SELECT count(*), tab_ysl_2.col1 FROM tab_ysl_1 join tab_ysl_2 on tab_ysl_1.col2 = tab_ysl_2.col2 WHERE tab_ysl_2.col2 > 2 GROUP BY tab_ysl_2.col1 ORDER BY tab_ysl_2.col1;

SELECT * FROM tab_ysl_1 join tab_ysl_2 on tab_ysl_1.col1 = tab_ysl_2.col1;

使用如下方式调用脚本,可以批量获取推荐索引,26000 为我的数据库端口,ysla 为我的数据库名,1.sql 为我待优化的 SQL 存放的文件

[omm@node1 index_advisor]$ pwd

/opt/gaussdb/app/bin/dbmind/index_advisor

[omm@node1 index_advisor]$ python3 ./index_advisor_workload.py 26000 ysla 1.sql

############################################################## Generate candidate indexes

table: tab_ysl_1 columns: col1

table: tab_ysl_1 columns: col2

table: tab_ysl_2 columns: col1

############################################################### Determine optimal indexes

create index ind0 on tab_ysl_1(col1);

四、索引效率查看

这里验证下索引推荐给我们推荐的索引究竟是否起到优化作用。

[omm@node1 index_advisor]$ cat 1.sql

SELECT * FROM tab_ysl_1 WHERE col1 = 10;

[omm@node1 index_advisor]$ time gsql -d ysla -p 26000 -f 1.sql

col1 | col2 | col3

------+------+------

10 | 10 | SSSS

(1 row)

total time: 35 ms

real 0m0.050s

user 0m0.007s

sys 0m0.002s

可以看到上边未优化的 SQL 执行时间为 0m0.050s

[omm@node1 index_advisor]$ python3 ./index_advisor_workload.py 26000 ysla 1.sql

############################################################## Generate candidate indexes

table: tab_ysl_1 columns: col1

############################################################### Determine optimal indexes

create index ind0 on tab_ysl_1(col1);

通过 Index-advisor 获取推荐索引。并创建索引

ysla=# create index ind0 on tab_ysl_1(col1);

CREATE INDEX

可以看到查询的时间明显减少。

[omm@node1 index_advisor]$ time gsql -d ysla -p 26000 -f 1.sql

col1 | col2 | col3

------+------+------

10 | 10 | SSSS

(1 row)

total time: 0 ms

real 0m0.016s

user 0m0.009s

sys 0m0.000s

虚拟索引

一般在加索引时,会堵塞 DML(不过 PG 支持并发加索引,不堵塞 DML) 。只有索引真正能起到优化作用,我们建立索引才是有意义的。虚拟索引是一个很有用的东西,没有副作用,只是虚拟的索引,建立虚拟索引后,可以通过 EXPLAIN 来查看加索引后的成本估算,判断是否加索引 COST 会降低。

可以用虚拟索引检验索引的效果,根据效果可选择是否创建真实的索引优化查询。

测试建立虚拟索引(hypopg_create_index)

ysla=# SELECT * FROM hypopg_create_index('CREATE INDEX ON tab_ysl_1(col1)');

indexrelid | indexname

------------+-----------------------------

41453 | <41453>btree_tab_ysl_1_col1

(1 row)

显示所有创建的虚拟索引信息(enable_hypo_index)

ysla=# select * from hypopg_display_index();

indexname | indexrelid | table | column

-----------------------------+------------+-----------+--------

<41454>btree_tab_ysl_1_col1 | 41454 | tab_ysl_1 | (col1)

(1 row)

ysla=# set enable_hypo_index = on;explain SELECT * FROM tab_ysl_1 WHERE col1 = 100;

SET

QUERY PLAN

Index Scan using <41453>btree_tab_ysl_1_col1 on tab_ysl_1 (cost=0.00..8.27 rows=1 width=13)

Index Cond: (col1 = 100)

(2 rows)

测试删除指定虚拟索引(hypopg_display_index)

使用函数hypopg_drop_index删除指定oid的虚拟索引

ysla=# select * from hypopg_drop_index(41454);

hypopg_drop_index

t

(1 row)

使用函数hypopg_reset_index一次性清除所有创建的虚拟索引

ysla=# SELECT * FROM hypopg_reset_index();

hypopg_reset_index

MOGDB/openGauss索引推荐及虚拟索引的更多相关文章

  1. ORACLE虚拟索引(Virtual Index)

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

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

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

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

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

  4. Oracle之虚拟索引

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

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

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

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

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

  7. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  8. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  9. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  10. SQL Server 深入解析索引存储(非聚集索引)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

随机推荐

  1. 这波操作看麻了!十亿行数据,从71s到1.7s的优化之路。

    你好呀,我是歪歪. 春节期间关注到了一个关于 Java 方面的比赛,很有意思.由于是开源的,我把项目拉下来试图学(白)习(嫖)别人的做题思路,在这期间一度让我产生了一个自我怀疑: 他们写的 Java ...

  2. 聊聊微信小程序的流式(stream)响应请求

    场景:类似ChatGPT的逐字显示效果. 流程:服务端我用Python的flask框架(向外提供API接口)实现,服务部署在replit上,Python调用azure 的chatgpt服务(需要申请) ...

  3. 影刀rpa:第二个项目学习心得

    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...

  4. 五: Mysql权限管理

    # 权限管理 关于MySQL的权限简单的理解就是MySQL允许你做你权力以内的事情,不可以越界.比如只允许你执行SELECT操 作, 那么你就不能执行UPDATE操作.只允许你从某台机器上连接MySQ ...

  5. git合并代码操作-2022新项目

    自己做开发工作已经好几年,以前由于都是开发一些小项目,基本上也没拉什么分支进行开发,也没有涉及到合并代码的操作,因此自己对于如何合并代码还真没有实际地操作过.今天负责人突然交给我一个任务,让我去合并代 ...

  6. 为什么defineProps宏函数不需要从vue中import导入?

    前言 我们每天写vue代码时都在用defineProps,但是你有没有思考过下面这些问题.为什么defineProps不需要import导入?为什么不能在非setup顶层使用defineProps?d ...

  7. 记本地新建一个gradle方式springboot项目过程

    打算使用gradle在idea新建个springboot项目,然后坑很多,记录一下 原来我的idea应该是社区版,新建项目时候没有可以选择spring相关配置,然后卸载了重装,之前问题是启动是启动起来 ...

  8. 17_详解YUV

    本文的主角是多媒体领域非常重要的一个概念:YUV. 简介 YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中. 也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式 ...

  9. C 可变参数函数分析(va_start,va_end,va_list...)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. HMAC算法:数据传输的保护神

    HMAC算法起源: HMAC(Hash-based Message Authentication Code)算法是由Mihir Bellare.Ran Canetti和Hugo Krawczyk于19 ...