opengauss中的sql hint实现解析
Hint是Oracle数据库中很有特色的一个功能,但是社区版pg是没有这个功能的,有个pg_hint_plan的插件,可以完成类似的功能。
但是opengauss直接自带了hint的功能,我们下面来看下opengauss关于hint的实现。
opengauss新增了一个hint_gram.y 来解析hint相关的语法。目前支持以下几种hint:
join_order_hint
join_method_hint
stream_hint
row_hint
scan_hint
skew_hint
pred_push_hint
等等。
对于opengauss, hint是以 /*+ 开头 以*/ 结尾的部分被定义为hint string。
例如 select /*+ TableScan(a) */ * from a where c1 > 1; 这个sql语句里的hint string就是TableScan(a), 它的含义是对于表a使用全表扫描而不是索引扫描。
在进行语法解析的时候,create_hintstate会将hint string解析成一个HintState结构体,然后在生成执行计划的时候,会根据HintState里的scan_hint字段的值来生成执行计划。 这样就起到了hint影响执行计划的效果。
typedef struct HintState {
NodeTag type;
int nall_hints; /* Hint num */
List* join_hint; /* Join hint list */
List* leading_hint; /* Leading hint list */
List* row_hint; /* Rows hint list */
List* stream_hint; /* stream hint list */
List* block_name_hint; /* block name hint list */
List* scan_hint; /* scan hint list */
List* skew_hint; /* skew hint list */
List* hint_warning; /* hint warning list */
bool multi_node_hint; /* multinode hint */
List* predpush_hint;
List* rewrite_hint; /* rewrite hint list */
} HintState;
其他类型的hint string的执行流程也大体类似,有时间的话笔者会继续分享。
- 点赞
- 收藏
- 关注作者
评论(0)