• [超硬核] 5000字带走读DuckDB优化器之常量折叠与比较简化


    DuckDB优化器之常量折叠与比较简化

    本篇文章适合学习C++的小伙伴,适合阅读开源项目的小伙伴,更适合学习数据库的小伙伴,欢迎与我一起探索优化器知识。

    目录

    • DuckDB优化器之常量折叠与比较简化

    • 1.优化器规则

    • 2.表达式重写

      • 2.1 重写/访问算子

      • 2.2 应用规则

      • 2.3 子表达式

    • 3.比较简化规则

    本节以一个SQL为例,揭秘DuckDB的优化器常量折叠与比较简化规则。

    • ConstantFoldingRule

      • 常量折叠

    • ComparisonSimplificationRule

      • 比较简化

    示例如下

    常量折叠:

    1. D explain select temp_lo from weather where temp_lo = 45 + 1;
    2. ┌─────────────────────────────┐
    3. │┌───────────────────────────┐│
    4. ││       Physical Plan       ││
    5. │└───────────────────────────┘│
    6. └─────────────────────────────┘
    7. ┌───────────────────────────┐
    8. │         SEQ_SCAN          │
    9. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    10. │          weather          │
    11. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    12. │          temp_lo          │
    13. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    14. │  Filters: temp_lo=46 AND  │
    15. │     temp_lo IS NOT NULL   │
    16. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    17. │           EC: 0           │
    18. └───────────────────────────┘  
    19.   
    20. // 重写前
    21. temp_lo = (45 + 1)
    22.   
    23. // 重写后
    24. (lldb) p expr->ToString() 
    25. temp_lo = 46

    比较简化:

    1. D explain select * from test where CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP;
    2. ┌─────────────────────────────┐
    3. │┌───────────────────────────┐│
    4. ││       Physical Plan       ││
    5. │└───────────────────────────┘│
    6. └─────────────────────────────┘
    7. ┌───────────────────────────┐
    8. │         SEQ_SCAN          │
    9. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    10. │            test           │
    11. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    12. │             i             │
    13. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    14. │Filters: i=1999-01-01 00:00
    15. │   :00 AND i IS NOT NULL   │
    16. │   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
    17. │           EC: 0           │
    18. └───────────────────────────┘ 
    19.   
    20. // 重写前
    21. CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP
    22. // 重写后
    23. i = '1999-01-01 00:00:00'

    这两条SQL语句的逻辑算子为:

    LOGICAL_EXPLAIN->LOGICAL_PROJECT->LOGICAL_FILTER->LOGICAL_GET

    顶层是explain,然后->表示其child,依次类推。

    内容已更新至知识星球,感兴趣加入即可。

    5e3b59815cfbd2865440255a4e9c8a46.jpeg

  • 相关阅读:
    SCI英语论文长难句攻略
    你看过字符画吗?用 Python 自己实现一个吧
    【原创】CPU性能优化小记
    osgEarth+VS2015开发环境搭建
    嵌入式学习笔记(47)Nand的常见操作及流程分析
    组合导航:中海达iNAV2产品描述及接口描述
    tensorrt deeplabv3+ 部署踩坑
    一级消防工程师证书价值下降,前景茫然?
    回溯算法的了解
    USACO Training 1.5 Arithmetic Progressions
  • 原文地址:https://blog.csdn.net/guangcheng0312q/article/details/132797929