Index-advisor 概述
⚫ 索引提供指向存储在表的指定列中的数据值的指针,如同图书的目录,能够加快表的查 询速度。
⚫ Index-advisor索引推荐的功能,共包含三个子功能:单query索引推荐、虚拟索引和
workload级别索引推荐。
单query 索引推荐
⚫ 单query索引推荐功能支持用户在数据库中直接进行操作,单query索引推荐功能基于查 询语句的语义信息和数据库的统计信息,对用户输入的单条查询语句生成推荐的索引。
⚫ 单query索引推荐功能涉及的函数接口如下:

单query 索引推荐示例
⚫ 使用gs_index_advise函数,获取针对该query生成的推荐索引,推荐结果由索引的表名和 列名组成。
⚫ 示例一:

上述结果表明:应当在 bmsql_customer 的 c_w_id 列上创建索引,可以通过下述SQL语句创
建索引:
CREATE INDEX idx on bmsql_customer(c_w_id);
⚫ 示例二:

则上述语句表明应该在表 t1 上创建一个联合索引(age, sex),可以通过下述SQL语句创建索引:
CREATE INDEX idx1 on t1(age, sex);
虚拟索引
⚫ 虚拟索引功能支持用户在数据库中直接进行操作,虚拟索引功能将模拟真实索引的建立,避免真 实索引创建所需的时间和空间开销,用户基于虚拟索引,可通过优化器评估该索引对指定查询语 句的代价影响。
⚫ 是否开启虚拟索引功能,虚拟索引功能的GUC参数:enable_hypo_index,默认为off。
⚫ 虚拟索引功能涉及的系统函数接口如下表所示:

虚拟索引示例
⚫ 使用函数hypopg_create_index创建虚拟索引。例如:

⚫ 开启GUC参数enable_hypo_index,该参数控制数据库的优化器进行EXPLAIN时是否考虑创建的虚拟索引。通过对特定的
查询语句执行explain,用户可根据优化器给出的执行计划评估该索引是否能够提升该查询语句的执行效率。例如:
postgres=> set enable_hypo_index = on; SET
⚫ 开启GUC参数前,执行EXPLAIN + 查询语句:

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

⚫ 通过对比两个执行计划可以观察到,该索引预计会降低指定查询语句的执行代价,用户可考虑创建对应的真实索引。
workload 级别索引推荐
⚫ 对于workload级别的索引推荐,用户可通过运行数据库外的脚本使用此功能,该功能将包含有多条DML语 句的workload作为输入,最终生成一批可对整体workload的执行表现进行优化的索引。
⚫ workload级别索引推荐使用前提:
数据库状态正常、客户端能够正常连接。
当前执行用户下安装有gsql工具,该工具路径已被加入到PATH环境变量中。
具备Python3.6+的环境。
⚫ 使用步骤:
准备好包含有多条DML语句的文件作为输入的workload,文件中每条语句占据一行。用户可从数据库的离线日志中获 得历史的业务语句。
运行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]
workload 级别索引推荐示例
⚫ 将执行多条的DML语句保存在tpcc_log.txt文件中,执行index_advisor_workload.py脚本。
python index_advisor_workload.py 6001 postgres tpcc_log.txt --max_index_num 10 -- multi_iter_mode
⚫ 推荐结果为一批索引,以多个创建索引语句的格式显示在屏幕上,结果如下:





