opengauss中的sql hint实现解析

举报
zenith 发表于 2021/03/25 20:33:28 2021/03/25
【摘要】 本文介绍了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的执行流程也大体类似,有时间的话笔者会继续分享。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。