1 概述
SQL引擎V2.0是使用 DuckDB 作为 数据模型 SQL 查询的执行引擎。
作为一款嵌入式数据库,DuckDB 专为高效处理大规模数据分析任务而设计,其内存引擎在其中扮演了至关重要的角色。
以下是关于 DuckDB 内存引擎的一些关键点:
内存中的数据结构
DuckDB 使用一种称为 "flat columnar" 的存储格式来组织数据。这种格式将表的每一列分别存储在一个连续的内存块中,而不是按行存储。这不仅提高了缓存命中率,还使得对单个列的操作更加高效,非常适合用于分析查询中常见的聚合操作。
矢量化执行
DuckDB 的内存引擎采用了矢量化执行模型。这意味着在处理数据时,它不是一次处理一行,而是批量处理一整批(通常是1024或更多)的数据记录。矢量化可以显著减少解释开销,并允许现代CPU更好地利用SIMD(单指令多数据流)指令集进行并行计算,从而大幅提升查询性能。
内存管理
DuckDB 的内存管理机制能够智能地决定何时将数据保留在内存中以及何时将其写回到磁盘。对于临时结果和中间状态,DuckDB 可以根据可用内存自动调整策略,确保即使是在资源受限的环境中也能保持良好的性能。此外,DuckDB 支持显式的内存预算设置,用户可以根据具体需求控制最大内存使用量。
并发与事务支持
尽管主要针对读密集型工作负载进行了优化,但 DuckDB 的内存引擎也提供了基本的并发控制和事务支持。它可以安全地处理多个并发查询,并保证ACID属性(原子性、一致性、隔离性和持久性),即使所有操作都在内存中完成。
内存中的索引
为了加速查询,DuckDB 在内存中构建了多种类型的索引结构,如哈希索引、B树索引等。这些索引可以帮助快速定位特定值的位置,减少不必要的全表扫描,提高查询效率。特别是在涉及大量连接或查找操作的情况下,适当的索引可以极大地改善性能。
数据压缩
为了更有效地利用有限的内存空间,DuckDB 实现了几种不同的压缩算法,可以在不影响性能的前提下减少数据占用的空间。例如,对于稀疏或重复率高的列,可以选择合适的压缩方法来降低内存消耗。
查询优化器
DuckDB 包含一个先进的查询优化器,该优化器能够在编译查询计划时考虑内存中的数据分布和其他因素,选择最有效的执行路径。这包括但不限于选择最优的联接顺序、估算成本以及应用各种代数变换来简化查询表达式。
综上所述,DuckDB 的内存引擎通过一系列的技术创新,实现了高效的数据处理能力和优秀的用户体验,特别适合那些需要频繁进行复杂分析查询的应用场景。无论是作为BI工具背后的强大后端,还是集成到其他应用程序中作为高性能的数据处理组件,DuckDB 的内存引擎都展示了其独特的优势。
使用前提
如何开启SQL引擎V2.0?
需要先在运维设置/系统限项/高级设置 中开启数据模型引擎V2.0:OLAP_QUERY_NEW_ENGINE_BUILD_MDX=true;
再开启SQL引擎V2.0:
USE_NEW_ENGINE_NEW_SQL=true。
2 SQL引擎V2.0 VS V1.0的差异
序号 | 内容 | V1.0 | V2.0 |
---|---|---|---|
1 | 快速计算支持走SQL引擎 | 不支持 | 支持 |
2 | 计算度量如果表达式仅涉及加(+)、减(-)、乘(*)、除(/),或者仅使用case when/IIF函数,也支持走SQL引擎 | 仅有clickhouse、mysql支持,其他库仍然不支持 | 全部库支持 |
3 | 中文排序结果可能不同,如下图: | V1.0显示效果: | V2.0显示效果: 排序不一致:主要是由于数据库本身的字符集或者中文编码而造成的排序结果不一样,有的中文排序结果是一样的,暂时没有得到什么规律。 |
4 | 空值(Null)的排序: | 由数据库决定 | 在SQL引擎V2.0时,升序时空值在第一行,降序在最后一行。 |
5 | 当数据模型是多事实并且是抽取模式(抽取到SmartbiMpp产品默认使用高速缓存库CH)中,如果度量的值没有时(full join 出现来的空),在报表层显示效果不一致。 | SQL引擎V1.0显示0 | SQL引擎V2.0显示空,数据是什么就显示什么: |