• [超硬核] 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

  • 相关阅读:
    基于AM335X开发板 (ARM Cortex-A8)——Linux系统使用手册 (上)
    每日一题 —— LC. 805 数组的均值分割
    nodejs+vue人脸识别考勤管理系统的设计与实现-计算机毕业设计
    Redis初识
    《Mycat分布式数据库架构》之原理
    mysql数据库优化--数据库参数
    Lazy Initialized Beans
    拙见--springMVC的controller接受的请求参数
    【树莓派 Pico 基于MicroPython编程Thonny开发】
    Java IO:异常处理的简介说明
  • 原文地址:https://blog.csdn.net/guangcheng0312q/article/details/132797929