openGauss学习笔记-49 openGauss 高级特性-索引推荐

文章目录

    • openGauss学习笔记-49 openGauss 高级特性-索引推荐
      • 49.1 单query索引推荐
      • 49.2 虚拟索引
      • 49.3 workload级别索引推荐

openGauss学习笔记-49 openGauss 高级特性-索引推荐

openGauss的索引推荐的功能,共包含三个子功能:单query索引推荐、虚拟索引和workload级别索引推荐。

49.1 单query索引推荐

单query索引推荐功能支持用户在数据库中直接进行操作,本功能基于查询语句的语义信息和数据库的统计信息,对用户输入的单条查询语句生成推荐的索引。本功能仅支持单条SELECT类型的语句,不支持其他类型的SQL语句。本功能依赖函数gs_index_advise实现。

表 1 单query索引推荐功能的接口

函数名参数功能
gs_index_adviseSQL语句字符串针对单条查询语句生成推荐索引。

使用上述函数,获取针对该query生成的推荐索引,推荐结果由索引的表名和列名组成。使用方法如下:

openGauss=# select "table", "column" from gs_index_advise('SELECT c_discount from bmsql_customer where c_w_id = 10');table      |  column  
----------------+----------bmsql_customer | (c_w_id)
(1 row)

上述结果表明,应当在表bmsql_customer的c_w_id列上创建索引。创建索引的命令如下:

CREATE INDEX idx on bmsql_customer(c_w_id);

某些SQL语句,也可能被推荐创建联合索引,例如:

openGauss=# select "table", "column" from gs_index_advise('select name, age, sex from t1 where age >= 18 and age < 35 and sex = ''f'';');table | column
-------+------------t1    | (age, sex)
(1 row)

则上述语句表明应该在表t1上创建一个联合索引 (age, sex)。创建索引的命令如下:

CREATE INDEX idx1 on t1(age, sex);

49.2 虚拟索引

虚拟索引功能支持用户在数据库中直接进行操作,本功能将模拟真实索引的建立,避免真实索引创建所需的时间和空间开销,用户基于虚拟索引,可通过优化器评估该索引对指定查询语句的代价影响。虚拟索引涉及的函数接口和GUC参数,请参见表2表3

表 2 虚拟索引功能的接口

函数名参数功能
hypopg_create_index创建索引语句的字符串创建虚拟索引。
hypopg_display_index显示所有创建的虚拟索引信息。
hypopg_drop_index索引的oid删除指定的虚拟索引。
hypopg_reset_index清除所有虚拟索引。
hypopg_estimate_size索引的oid估计指定索引创建所需的空间大小。

表 3 虚拟索引功能的GUC参数

参数名功能默认值
enable_hypo_index是否开启虚拟索引功能off

使用方法如下:

  1. 使用函数hypopg_create_index创建虚拟索引。

    openGauss=# select * from hypopg_create_index('create index on bmsql_customer(c_w_id)');indexrelid |              indexname              
    ------------+-------------------------------------329726 | <329726>btree_bmsql_customer_c_w_id
    (1 row)
    
  2. 开启GUC参数enable_hypo_index,该参数控制数据库的优化器进行EXPLAIN时是否考虑创建的虚拟索引。通过对特定的查询语句执行explain,用户可根据优化器给出的执行计划评估该索引是否能够提升该查询语句的执行效率。例如:

    开启GUC参数前,执行EXPLAIN + 查询语句:

    openGauss=# explain SELECT c_discount from bmsql_customer where c_w_id = 10;QUERY PLAN                              
    ----------------------------------------------------------------------Seq Scan on bmsql_customer  (cost=0.00..52963.06 rows=31224 width=4)Filter: (c_w_id = 10)
    (2 rows)
    

    开启GUC参数:

    openGauss=# set enable_hypo_index = on;
    SET
    

    开启GUC参数后,执行EXPLAIN + 查询语句:

    openGauss=# explain SELECT c_discount from bmsql_customer where c_w_id = 10;QUERY PLAN                                                    
    ------------------------------------------------------------------------------------------------------------------[Bypass]Index Scan using <329726>btree_bmsql_customer_c_w_id on bmsql_customer  (cost=0.00..39678.69 rows=31224 width=4)Index Cond: (c_w_id = 10)
    (3 rows)
    

    通过对比两个执行计划可以观察到,该索引预计会降低指定查询语句的执行代价,用户可考虑创建对应的真实索引。

  3. (可选)使用函数hypopg_display_index展示所有创建过的虚拟索引。例如:

    openGauss=# select * from hypopg_display_index();indexname                  | indexrelid |     table      |      column      
    --------------------------------------------+------------+----------------+------------------<329726>btree_bmsql_customer_c_w_id        |     329726 | bmsql_customer | (c_w_id)<329729>btree_bmsql_customer_c_d_id_c_w_id |     329729 | bmsql_customer | (c_d_id, c_w_id)
    (2 rows)
    
  4. (可选)使用函数hypopg_estimate_size估计虚拟索引创建所需的空间大小(单位:字节)。例如:

    openGauss=# select * from hypopg_estimate_size(329730);hypopg_estimate_size 
    ----------------------15687680
    (1 row)
    
  5. 删除虚拟索引。

    使用函数hypopg_drop_index删除指定oid的虚拟索引。例如:

    openGauss=# select * from hypopg_drop_index(329726);hypopg_drop_index 
    -------------------t
    (1 row)
    

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

    openGauss=# select * from hypopg_reset_index();hypopg_reset_index 
    --------------------(1 row)
    

49.3 workload级别索引推荐

对于workload级别的索引推荐,用户可通过运行数据库外的脚本使用此功能,本功能将包含有多条DML语句的workload作为输入,最终生成一批可对整体workload的执行表现进行优化的索引。

  1. 准备好包含有多条DML语句的文件作为输入的workload,文件中每条语句占据一行。用户可从数据库的离线日志中获得历史的业务语句。

  2. 运行python脚本index_advisor_workload.py,命令如下:

    python index_advisor_workload.py [p PORT] [d DATABASE] [f FILE] [--h HOST] [-U USERNAME] [-W PASSWORD][--schema SCHEMA]
    [--max_index_num MAX_INDEX_NUM][--max_index_storage MAX_INDEX_STORAGE] [--multi_iter_mode] [--multi_node]  [--json] [--driver] [--show_detail]
    

    其中的输入参数依次为:

    • PORT:连接数据库的端口号。
    • DATABASE:连接数据库的名字。
    • FILE:包含workload语句的文件路径。
    • HOST:(可选)连接数据库的主机号。
    • USERNAME:(可选)连接数据库的用户名。
    • PASSWORD:(可选)连接数据库用户的密码。
    • SCHEMA:模式名称。
    • MAX_INDEX_NUM:(可选)最大的索引推荐数目。
    • MAX_INDEX_STORAGE:(可选)最大的索引集合空间大小。
    • multi_node:(可选)指定当前是否为分布式数据库实例。
    • multi_iter_mode:(可选)算法模式,可通过是否设置该参数来切换算法。
    • json:(可选)指定workload语句的文件路径格式为SQL归一化后的json,默认格式每条SQL占一行。
    • driver:(可选)指定是否使用python驱动器连接数据库,默认gsql连接。
    • show_detail:(可选)是否显示当前推荐索引集合的详细优化信息。

    例如:

    python index_advisor_workload.py 6001 postgres tpcc_log.txt --schema public --max_index_num 10 --multi_iter_mode
    

    推荐结果为一批索引,以多个创建索引语句的格式显示在屏幕上,结果示例。

    create index ind0 on public.bmsql_stock(s_i_id,s_w_id);
    create index ind1 on public.bmsql_customer(c_w_id,c_id,c_d_id);
    create index ind2 on public.bmsql_order_line(ol_w_id,ol_o_id,ol_d_id);
    create index ind3 on public.bmsql_item(i_id);
    create index ind4 on public.bmsql_oorder(o_w_id,o_id,o_d_id);
    create index ind5 on public.bmsql_new_order(no_w_id,no_d_id,no_o_id);
    create index ind6 on public.bmsql_customer(c_w_id,c_d_id,c_last,c_first);
    create index ind7 on public.bmsql_new_order(no_w_id);
    create index ind8 on public.bmsql_oorder(o_w_id,o_c_id,o_d_id);
    create index ind9 on public.bmsql_district(d_w_id);
    

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 实现日志打印输出在控制台应用程序中

在本文中&#xff0c;我们将探讨如何在 .NET Core 应用程序中将日志消息输出到控制台&#xff0c;从而更好地了解应用程序的运行状况。 .NET Core 实现日志打印输出在控制台应用程序中 在 .NET Core 中&#xff0c;日志输出打印是使用 Microsoft.Extensions.Logging 命名空间…

phpspreadsheet导出excel自动获得列,数字下标

安装composer require phpoffice/phpspreadsheetuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Border;$spreadsheet new Spreadsheet(); $sheet $spreadsheet->getActiveSheet();//从65开&a…

谷歌浏览器调试技巧

一、概述 记录谷歌浏览器实用的调试技巧。 二、详解 技巧1&#xff1a;打开F12调试工具的前提下按下Ctrl Shift P 如下图所示&#xff0c;按下组合键&#xff0c;可打开命令面板。 技巧2&#xff1a;调试工具的Element面板下&#xff0c;按照Alt 鼠标左键可以将目标节点全部…

redis应用 2:延时队列

我们平时习惯于使用 Rabbitmq 和 Kafka 作为消息队列中间件&#xff0c;来给应用程序之间增加异步消息传递功能。这两个中间件都是专业的消息队列中间件&#xff0c;特性之多超出了大多数人的理解能力。 使用过 Rabbitmq 的同学知道它使用起来有多复杂&#xff0c;发消息之前要…

【网络】多路转接——五种IO模型 | select

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 五种IO模型 | select &#x1f367;五种IO模型&#x1f367;select&#x1f9c1;认识接口&#x1f9c1…

网工内推 | IT网工,华为、华三认证优先,15k*13薪

01 广东善能科技发展股份有限公司 招聘岗位&#xff1a;IT网络工程师 职责描述&#xff1a; 1、负责公司项目售后技术支持工作&#xff1b; 2、负责项目交付实施&#xff0c;配置调试、运维等&#xff1b; 3、参加合作厂商产品技术知识培训&#xff1b; 4、参加合作厂商工程师…

flink on yarn with kerberos 边缘提交

flink on yarn 带kerberos 远程提交 实现 flink kerberos 配置 先使用ugi进行一次认证正常提交 import com.google.common.io.Files; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.flink.client.cli.CliFrontend; import o…

大数据(四)主流大数据技术

大数据&#xff08;四&#xff09;主流大数据技术 一、写在前面的话 To 那些被折磨打击的好女孩&#xff08;好男孩&#xff09;&#xff1a; 有些事情我们无法选择&#xff0c;也无法逃避伤害。 但请你在任何时候都记住&#xff1a; 你可能在一些人面前&#xff0c;一文不值&a…

nacos服务器启动报错集合

报错1 Error creating bean with name ‘user‘: Unsatisfied dependency expressed through field ‘jwtTokenManage 开启鉴权之后&#xff0c;你可以自定义用于生成JWT令牌的密钥&#xff0c;application.properties中的配置信息为&#xff1a; ### Since 1.4.1, worked when…

git版本管理加合并笔记

目录 1.创建空文件夹&#xff0c;右键Bash here打开 2.打开链接&#xff0c;点击克隆下载&#xff0c;复制SSH链接 3.输入git SSH链接 回车 4.换成https在桌面上进行克隆仓库就正常了 5.去vscode里改东西 6.提交 7.创建dev分支 8.在dev里修改内容&#xff0c;提交&…

自动化测试(三):接口自动化pytest测试框架

文章目录 1. 接口自动化的实现2. 知识要点及实践2.1 requests.post传递的参数本质2.2 pytest单元测试框架2.2.1 pytest框架简介2.2.2 pytest装饰器2.2.3 断言、allure测试报告2.2.4 接口关联、封装改进YAML动态传参&#xff08;热加载&#xff09; 2.3 pytest接口封装&#xff…

screen命令,可以断开服务器连接,依旧能运行你的程序了

可以参考博客1&#xff1a;https://blog.csdn.net/nima_zhang_b/article/details/82797928 可以参考博客2:https://blog.csdn.net/herocheney/article/details/130984403 Linux中的screen是一个命令行工具&#xff0c;可以让用户在同一个终端会话中创建多个虚拟终端。它非常有…

顺序表链表OJ题(3)——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天是链表顺序表OJ练习题最后一次分享&#xff0c;每一次的分享题目的难度也再有所提高&#xff0c;但是我相信大家都是非常机智的&#xff0c;希望看到博主文章能学到东西的可以一键三连关注一下博主…

C语言之数组题

目录 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 5.扫雷 6.概念辨析tips 我又来了&#xff0c;今天是数组题&#xff0c;本人还在补军训真的热&#xff01;&#x1f197; 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 …

首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”

迄今为止&#xff0c;亚马逊云科技已经参与了21世纪几乎所有的大型计算变革&#xff0c;亚马逊云科技是一个很传奇的故事&#xff0c;它始于大约20年前的一项实验&#xff0c;当时亚马逊试图出售其过剩的服务器。人们确实对此表示怀疑。为什么在线书店试图销售云服务&#xff1…

RBAC实现授权

RBAC分为两种方式&#xff1a; 基于角色的访问控制&#xff08;Role-Based Access Control&#xff09; 基于资源的访问控制&#xff08;Resource-Based Access Control&#xff09; 角色的访问控制&#xff08;Role-Based Access Control&#xff09;是按角色进行授权&…

浅谈AI浪潮下的视频大数据发展趋势与应用

视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步&#xff0c;人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式&#xff0c;视频内容已经不再是单一的娱乐方式&#xff0c;更是涉及到教育、医疗、商业等各个领域。 为了…

JVM 内存大对象监控和优化实践

作者&#xff1a;vivo 互联网服务器团队 - Liu Zhen、Ye Wenhao 服务器内存问题是影响应用程序性能和稳定性的重要因素之一&#xff0c;需要及时排查和优化。本文介绍了某核心服务内存问题排查与解决过程。首先在JVM与大对象优化上进行了有效的实践&#xff0c;其次在故障转移与…

Unity——音乐、音效

在游戏运行的过程中&#xff0c;音效的播放时机与游戏当前内容密切相关&#xff0c;而且随着场景的变化、剧情的推进&#xff0c;背景音乐也需要适时切换&#xff0c;所以恰当地控制音乐和音效的播放非常重要。音乐和音效的播放、停止、切换和音量变化等&#xff0c;都需要由脚…

AS报错:CreateProcess error=206,文件名或扩展名太长

背景&#xff1a;今天编译公司的项目&#xff0c;第一次编译Ok&#xff0c;修改代码之后&#xff0c;第二次编译报错&#xff0c;报错信息&#xff1a;CreateProcess error206&#xff0c;文件名或扩展名太长。 同时删除build文件夹时报错&#xff1a;另一个程序正在使用此文件…