openGauss数据库源码解析系列文章—— AI技术之“智能索引推荐”_pg_catalog(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

……
// 获得创建索引的表的oid
relid = RangeVarGetRelid(node->relation, AccessShareLock, false);
……
// 对该创建索引的语句进行语法解析
node = transformIndexStmt(relid, node, queryString);
……
// 新建虚拟索引,该虚拟索引的结构体类型hypoIndex定于位于文件openGauss-server/src/include/dbmind/hypopg_index.h,与索引结构体IndexOptInfo类似
entry = hypo_newIndex(relid, node->accessMethod, nkeycolumns, ninccolumns, node->options);
// 根据语法树的解析结果为虚拟索引entry内的各个成员赋值
PG_TRY();
{
……
entry->unique = node->unique;
entry->ncolumns = nkeycolumns + ninccolumns;
entry->nkeycolumns = nkeycolumns;
……
}
PG_CATCH();
{
hypo_index_pfree(entry);
PG_RE_THROW();
}
PG_END_TRY();
// 设置虚拟索引的名字
hypo_set_indexname(entry, indexRelationName.data);
// 将新建的虚拟索引entry添加到虚拟索引的全局链表hypoIndexes上,该全局变量为节点类型为hypoIndex*的List链表,记录了全部创建过的虚拟索引
hypo_addIndex(entry);

return entry;

}
// 该函数被赋值给全局的函数指针get_relation_info_hook,当数据库执行EXPLAIN时,会通过该函数指针跳转到本函数
void hypo_get_relation_info_hook(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo rel)
{
/
判断是否开启GUC参数enable_hypo_index,当SQL语句是EXPLAIN命令时,变量isExplain的值为真 */
if (u_sess->attr.attr_sql.enable_hypo_index && isExplain) {
Relation relation;

    relation = heap_open(relationObjectId, AccessShareLock);

    if (relation->rd_rel->relkind == RELKIND_RELATION) {
        ListCell *lc;
        /* 遍历全局变量链表hypoIndexes中的每个创建过的虚拟索引 */
        foreach (lc, hypoIndexes) {
            hypoIndex *entry = (hypoIndex *)lfirst(lc);
            // 判断该虚拟索引和该表是否匹配
            if (hypo_index_match_table(entry, RelationGetRelid(relation))) {
                // 如果匹配,则将该索引加入该表的indexlist中,indexlist是节点类型为IndexOptInfo的链表,是结构体类型RelOptInfo的成员,记录了表的所有的索引
                hypo_injectHypotheticalIndex(root, relationObjectId, inhparent, rel, relation, entry);
            }
        }
    }
    heap_close(relation, AccessShareLock);

}
……
}


### 8.4.5 使用示例


#### 1. 单条查询语句的索引推荐


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



 表8-9 单query索引推荐功能的函数接口 



| 函数名 | 参数 | 返回值 | 功能 |
| --- | --- | --- | --- |
| gs\_index\_advise | SQL语句字符串 | 无 | 针对单条查询语句生成推荐索引(该版本只支持B树索引) |


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



opengauss=> select * 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 * 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),可以通过下述命令创建该索引,并将其命名为idx1。



CREATE INDEX idx1 on t1(age, sex);


#### 2. 虚拟索引


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



 表8-10 虚拟索引功能的接口 



| 函数名 | 参数 | 返回值 | 功能 |
| --- | --- | --- | --- |
| hypopg\_create\_index | 创建索引语句的字符串 | 无 | 创建虚拟索引 |
| hypopg\_display\_index | 无 | 结果集 | 显示所有创建的虚拟索引信息 |
| hypopg\_drop\_index | 索引的oid | 无 | 删除指定的虚拟索引 |
| hypopg\_reset\_index | 无 | 无 | 清除所有虚拟索引 |
| hypopg\_estimate\_size | 索引的oid | 整数型 | 估计指定索引创建所需的空间大小 |


本功能涉及的GUC参数如表8-11所示。



 表8-11 GUC参数 




|  |  |  |  |  |
| --- | --- | --- | --- | --- |
| 参数名 | 级别 | 功能 | 类型 | 默认值 |
| enable\_hypo\_index | PGC\_USERSET | 是否开启虚拟索引功能 | bool | 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,用户可根据优化器给出的执行计划评估该索引是否能够提升该查询语句的执行效率。例如:



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)


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


#### 3. 基于工作负载的索引推荐


对于工作负载级别的索引推荐,用户可通过运行数据库外的脚本使用此功能,本功能将包含有多条DML语句的工作负载作为输入,最终生成一批可对针对整体工作负载的索引。  
 (1) 准备好包含有多条DML语句的文件作为输入的工作负载,文件中每条语句占据一行。用户可从数据库的离线日志中获得历史的业务语句。  
 (2) 运行python脚本index\_advisor\_workload.py,命令如下:



python index_advisor_workload.py [p PORT] [d DATABASE] [f FILE] [–h HOST] [-U USERNAME] [-W PASSWORD]
[–max_index_num MAX_INDEX_NUM] [–multi_iter_mode]


其中的输入参数如下。  
 ① PORT:连接数据库的端口号。  
 ② DATABASE:连接数据库的名字。  
 ③ FILE:包含workload语句的文件路径。  
 ④ HOST:(可选)连接数据库的主机号。  
 ⑤ USERNAME:(可选)连接数据库的用户名。  
 ⑥ PASSWORD:(可选)连接数据库用户的密码。  
 ⑦ MAX\_INDEX\_NUM:(可选)最大的索引推荐数目。  
 ⑧ multi\_iter\_mode:(可选)算法模式,可通过是否设置该参数来切换算法。例如:



python index_advisor_workload.py 6001 opengauss tpcc_log.txt --max_index_num 10 --multi_iter_mode


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



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


感谢大家学习第8章 AI技术中“8.4 智能索引推荐”的精彩内容,下一篇我们开启“8.5 指标采集、预测与异常检测”的相关内容的介绍。  
 敬请期待。



### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料


网络安全面试题


![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)


绿盟护网行动


![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)


还有大家最喜欢的黑客技术


![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)


**网络安全源码合集+工具包**


![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)


![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/39b20b2be703a544023e893c0bcbabed.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-AjRChcYC-1713388204977)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值