码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 用HTTP服务的方式集成 learned cardinality estimate 方法进 Postgresql


    目录

    • 整体流程
    • PG原版基数估计调用逻辑
    • 修改源码
    • 效果
    • 待完善
    •  参考资料

     


    代码地址:postgresql-13.1-ml: Integration of CardEst Methods into PostgreSQL by HTTP Server (github.com)

    当前进度:可以支持单表查询的基数估计模块的替换。至于多表join的基数估计模块替换还在开发中

    注意:本文的重点在于PG的修改。记录一下我的修改思路。

    回到顶部

    整体流程

    PG作为http客户端,向基数估计服务端发送http请求。内容为需要基数估计的sql语句。

    基数估计服务端返回该语句的selectivity。

    PG收到该查询的selectivity后乘以当前表的大小,即得到rows

    回到顶部

    PG原版基数估计调用逻辑

    回到顶部

    修改源码

    主要修改代码costsize.c

    单表修改set_baserel_size_estimates函数

    修改逻辑

    其中get_expr函数的逻辑可参考print.c文件中print_expr函数

    多表修改set_joinrel_size_estimates函数

    待续

    添加第三方库

    该项目需要其它两个第三方库

    • C语言的HTTP服务的client端的库,参考项目:linux下socket(C)构造HTTP客户端
    • C语言解析json格式的库,参考项目:cJSON

    将第三方库的头文件和实现文件加入到PG中:

    • 把http.h 添加到 /src/include/utils/下
    • costsize.c 添加 #include "utils/http.h”
    • 把cJSON.h 添加到 /src/include/utils/下
    • 把cJSON.c 添加到 /src/backend/utils/adt/下
    • cJSON.c 把#include "cJSON.h”修改成#include "utils/cJSON.h”
    • 在/src/backend/utils/adt/Makefile添加 cJSON.o \
    • costsize.c 添加 #include "utils/cJSON.h”
    回到顶部

    效果

    单表查询的效果

    测试数据集:imdb.title

    PG原版计划 VS learned方法的计划

    最优计划

    可以看到learned方法基数估计更准确,产生的执行计划与基数估计几乎正常产生的计划一致。而PG原版的基数估计由于准确度太低,导致产生了次优的执行计划。

    虽然learned方法的速度没有PG原版快,但产生的计划更优,导致节省了执行时间,所以整体时间更优。

    多表查询的效果

    待续

    回到顶部

    待完善

    1. 多表查询的基数估计部分还在开发中
    2. 当前版本只适用于实验环境。尚未对不支持的查询进行过滤。
    回到顶部

     参考资料

    1. End-to-End-CardEst-Benchmark
    2. VLDBSS2022实验
    3. PostgreSQL 在内核增加一个配置参数
    4. linux下socket(C)构造HTTP客户端
    5. cJSON使用详细教程 | 一个轻量级C语言JSON解析器
    6. cJSON

     

  • 相关阅读:
    C# 使用ListBox及Picturebox显示所选的任意路径文件夹下的图像
    JAVA Swing + Jdbc 实现宿舍管理系统
    LINUX信号
    「PaddleOCR」 模型应用优化流程
    uniapp 跨页面传值及跨页面方法调用
    用于 3D 点云形状分析的多视图Vision-to-Geometry知识迁移
    element ui this.$msgbox 自定义组件
    SOLIDWORKS Visualize 界面介绍
    验证NIO的非阻塞模型
    【Linux系统管理】11 启动引导与修复
  • 原文地址:https://www.cnblogs.com/kitten-t/p/16595472.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号