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

单query索引推荐

单query索引推荐功能支持用户在数据库中直接进行操作,本功能基于查询语句的语义信息和数据库的统计信息,对用户输入的单条查询语句生成推荐的索引。本功能涉及的函数接口如下。

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

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

说明:

  • 本功能仅支持单条SELECT类型的语句,不支持其他类型的SQL语句。
  • 本功能暂不支持分区表、列存表、段页式表、普通视图、物化视图、全局临时表以及密态数据库。

使用方法
使用上述函数,获取针对该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 列上创建索引,例如可以通过下述SQL语句创建索引:

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);

说明: 系统函数gs_index_advise()的参数是文本型,如果参数中存在如单引号(’)等特殊字符,可以使用单引号(’)进行转义,可参考上述示例。

虚拟索引

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

本功能涉及的系统函数接口如下表所示:

表 1 虚拟索引功能的接口

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

本功能涉及的GUC参数如下:

表 2 虚拟索引功能的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)`
  1. 开启GUC参数enable_hypo_index,该参数控制数据库的优化器进行EXPLAIN时是否考虑创建的虚拟索引。通过对特定的查询语句执行explain,用户可根据优化器给出的执行计划评估该索引是否能够提升该查询语句的执行效率。例如:
 `openGauss=> set enable_hypo_index = on;
SET`

开启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参数后,执行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)
  1. (可选)使用函数hypopg_estimate_size估计虚拟索引创建所需的空间大小(单位:字节)。例如:
openGauss=> select * from hypopg_estimate_size(329730);hypopg_estimate_size
----------------------15687680
(1 row)
  1. 删除虚拟索引。
    使用函数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)

说明:

  • 执行EXPLAIN ANALYZE不会涉及虚拟索引功能。
  • 创建的虚拟索引是数据库实例级别的,各个会话(session)之间可共享设置,关闭会话后虚拟索引仍可存在,但是重启数据库后将被清空。
  • 本功能暂不支持视图、物化视图、列存表。

workload级别索引推荐

对于workload级别的索引推荐,用户可通过运行数据库外的脚本使用此功能,本功能将包含有多条DML语句的workload作为输入,最终生成一批可对整体workload的执行表现进行优化的索引。同时,本功能提供从日志中抽取业务数据SQL流水的功能。

前提条件

  1. 数据库状态正常、客户端能够正常连接。

  2. 当前执行用户下安装有gsql工具,该工具路径已被加入到PATH环境变量中。

  3. 具备Python3.6+的环境。

  4. 若使用本功能提供的业务数据抽取功能,需提前将要收集的节点的GUC参数按如下设置:

    • log_min_duration_statement = 0
    • log_statement= ‘all’

说明: 业务数据抽取完毕建议将上述GUC参数复原,否则容易导致日志文件膨胀。

业务数据抽取脚本使用步骤

  1. 按前提条件中要求设置相关GUC参数。
  2. 运行python脚本extract_log.py,命令如下:
python extract_log.py [l LOG_DIRECTORY] [f OUTPUT_FILE] [-d DATABASE] [-U USERNAME][--start_time] [--sql_amount] [--statement] [--json]

其中的输入参数依次为:

  • LOG_DIRECTORY:pg_log的存放目录。
  • OUTPUT_PATH:输出SQL流水文件文件的保存路径,即抽取出的业务数据存放的文件路径。
  • DATABASE:(可选)数据库名称,不指定默认所有数据库。
  • USERNAME:(可选)用户名称,不指定默认所有用户。
  • start_time:(可选)日志收集的开始时间, 不指定默认所有文件。
  • sql_amount:(可选)收集SQL数量的最大值, 不指定默认收集所有SQL。
  • statement:(可选)表示收集pg_log日志中statement标识开头的SQL,不指定默认不收集。
  • json:指定收集日志的文件存储格式为SQL归一化后的json,不指定默认格式每条SQL占一行。

使用示例:

python extract_log.py $GAUSSLOG/pg_log/dn_6001 sql_log.txt -d postgres -U omm --start_time '2021-07-06 00:00:00' --statement
  1. 将1中设置的GUC参数还原为设置前的值。

索引推荐脚本使用步骤

  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);

说明: multi_node参数需严格按照当前数据库架构进行指定,否则推荐结果不全,甚至导致无推荐结果。

前沿科技探究之AI在索引推荐的应用相关推荐

  1. 前沿科技探究DeepSQL:库内AI算法

    数据库DeepSQL特性实现DB4AI功能,即在数据库内实现AI算法,以更好的支撑大数据的快速分析和计算.这里提供了一整套基于SQL的机器学习.数据挖掘以及统计学的算法,用户可以直接使用SQL进行机器 ...

  2. 互联网下半场新征程启航,AI、大数据等前沿科技助力传统零售产业转型

    基于AI.大数据和云服务等技术,传统零售变革升级为"新零售",而在技术之外,我们还需要警惕什么? 19-20日,全球互联网经济大会-GIEC2018春季峰会在南京楚翘城会议中心举行 ...

  3. AIGC:Stable Diffusion(一项普通人就能实现的AI前沿科技)的简介、Stable Diffusion2.0的改进、安装、使用方法(文本到图像/图像修改/超分辨率/图像修复)之详细攻略

    AIGC:Stable Diffusion(一项普通人就能实现的AI前沿科技)的简介.Stable Diffusion2.0的改进.安装.使用方法(文本到图像/图像修改/超分辨率/图像修复)之详细攻略 ...

  4. 首届百度商业AI技术创新大赛重磅启动,以前沿科技革新生产力

    随着生成式AI在全球范围的热议,你可以想象在不远的将来AI将与你的工作.生活.出行等各种场景紧密相连.正如百度创始人.董事长兼CEO李彦宏所说:"以深度学习.算法为代表的人工智能革命是第四次 ...

  5. AI: 2021 年人工智能前沿科技报告02(更新中……)daiding

    AI: 2021 年人工智能前沿科技报告02(更新中--) 2021 年对于人工智能技术和产业,依旧是不平凡的一年.随着算力.数据.算法等要素逐渐齐备,先进的算法结构不断涌现,各个研究方向研究成果不断 ...

  6. 前沿科技 | 中科院科学家在关于运动规划的环路机制研究方面获进展

    来源:中国科学院网站 今年5月11日,Nature Communications在线发表了题为<皮层上丘环路在记忆依赖感知决策任务中的作用机制>的研究论文,该研究由中国科学院科学家团队-- ...

  7. SpaceX星舰原型机高空测试爆炸,Airbnb上市成就2020最大IPO|前沿科技周报

    热点追踪 / 深度探讨 / 实地探访 / 商务合作 Hello大家好!硅谷前沿科技周报又跟大家见面了.上周科技界又发生了哪些大事呢?让小探带你来看看吧~ 首先是大公司方面,美国宇航局(NASA)宣布了 ...

  8. 拒绝赛博朋克:斯坦福HAI报告警示“科技巨头垄断AI研究已成威胁”,力挺「国家安全云」计划...

    来源:AI科技评论 作者:莓酊 编辑:青暮 人工智能技术从诞生伊始就被冠以悬在人类头上的达摩克利斯剑之名.在游戏<赛博朋克2077>(Cyberpunk 2077)中,超级科技企业荒坂集团 ...

  9. 【追一科技校招】AI浪潮已来,你不可错过的澎湃风口!

    作为专注深度服务企业的人工智能新锐,追一科技正在将 AI 从象牙塔和实验室,带向更宽广的工业和产业界,在一个个场景化应用中落地生花.我们以自然语言处理的深度积累,结合最前沿深度学习.认知计算等技术,赋 ...

最新文章

  1. Linux 内核,30 年C 语言将升级至 C11
  2. python语言能做什么软件-什么是Python语言,Python语言可以用来做什么?
  3. 全球与中国太赫兹安检仪市场竞争状况及未来发展趋向分析报告2022-2028年版
  4. FreeRTOS 低功耗之 tickless 模式
  5. java B2B2C源码电子商务平台 - Zuul回退机制
  6. 完整国内城市js级联选择
  7. tomcat如何修改java版本_Java程序员必备——Tomcat配置技巧Top10
  8. PrimeFaces 5.0 DataTable列切换器
  9. python、中循环功能可通过什么命令实现_python定时执行指定函数的方法 Python如何定时循环执行命令?...
  10. 解决方案:重复抢单(Redis原子计数器incr)
  11. Android笔记 codeUI与html UI
  12. 计算机系统操作技师考试题,机关事业单位技术工人计算机操作技师考试题库
  13. Unity2020.1新功能探路:图形渲染相关更新
  14. sql两个in并列_SQL窗口函数
  15. 画分段函数_秃头节:“函数”段子已出炉高中数学题型分析
  16. vue watch高级用法
  17. 使用python控制其他软件运行并操作处理数据_Python 运行其他程序
  18. LoadRunner录制app脚本详解
  19. 近五年计算机考研国家线、自划线汇总!
  20. 网络攻击与防范—术语和工具介绍

热门文章

  1. 亿图图示--工业自动化模块--啤酒生产处理流程简图和热水冷凝处理架构
  2. 临床执业助理医师(综合练习)题库【5】
  3. BP算法的反向传播和权值修正(1)
  4. C语言每日一练——第133天:打鱼还是晒网
  5. 鼠标被计算机无法识别怎么办,电脑无法识别鼠标的处理方案
  6. 教你三分钟用docker compose搭建一个自己的个人博客网站
  7. Text to face:寻找黛玉-从语言描述到人脸图像生成
  8. 冒志鸿:大公司不模仿你,说明你危险了
  9. 交叉编译apr和apr-util库
  10. Archlinux安装MacBook无线网卡驱动 (Broadcom 4360)