跳转到主要内容
理解 DataStore 的惰性求值模型,是高效使用它并获得最佳性能的关键。

惰性求值

DataStore 采用惰性求值——操作不会立即执行,而是会先记录下来并编译为优化后的 SQL 查询。只有在实际需要结果时,才会执行。

示例:惰性求值与急切求值

惰性求值的优势

  1. 查询优化:多个操作会编译成一条优化后的 SQL 查询
  2. 过滤器下推:在数据源层面应用过滤器
  3. 列裁剪:只读取所需列
  4. 延迟决策:可在运行时选择执行引擎
  5. 计划检查:可在执行前查看/调试查询

执行触发时机

当需要实际值时,会自动开始执行:

自动触发

示例:

保持惰性执行的操作

示例:

三阶段执行

DataStore 操作采用三阶段执行模型:

阶段 1:SQL 查询构建 (惰性)

可用 SQL 表达的操作会先收集起来:

第 2 阶段:执行点

当触发条件满足时,将执行累积的 SQL:

阶段 3:DataFrame 操作 (如有)

如果你在执行后继续链式调用仅 pandas 支持的操作:

查看执行计划

使用 explain() 查看实际会执行的内容:
Query
Response
使用 verbose=True 查看更多详细信息:
参见调试:explain(),获取完整文档。

缓存

DataStore 会缓存执行结果,以避免重复查询。

缓存的工作原理

缓存失效

对 DataStore 的修改操作会使缓存失效:

手动缓存控制


混合使用 SQL 和 Pandas 操作

DataStore 能够智能处理混合使用 SQL 和 pandas 的操作:

与 SQL 兼容的操作

这些可编译为 SQL:
  • filter(), where()
  • select()
  • groupby(), agg()
  • sort(), orderby()
  • limit(), offset()
  • join(), union()
  • distinct()
  • 列运算 (数学运算、比较、字符串方法)

仅 Pandas 支持的操作

这些操作会触发执行,并使用 pandas:
  • 搭配自定义函数的 apply()
  • 带复杂聚合的 pivot_table()
  • stack()unstack()
  • 对已执行 DataFrame 的操作

混合型管道


执行引擎选择

DataStore 可通过不同的引擎执行操作:

自动模式 (默认)

强制使用 chDB 引擎

强制使用 pandas 引擎

详见配置:执行引擎了解详情。

性能影响

好:尽早过滤

不佳:过晚应用过滤器

推荐:尽早选择所需列

好:让 SQL 来完成工作


最佳实践总结

  1. 执行前先串联好各项操作 - 先构建完整查询,再统一触发一次
  2. 尽早过滤 - 在源头减少数据
  3. 只选择所需的列 - 列裁剪可提升性能
  4. 使用 explain() 了解执行过程 - 运行前先调试
  5. 让 SQL 处理聚合 - ClickHouse 已针对此进行了优化
  6. 留意执行触发时机 - 避免意外过早执行
  7. 合理使用缓存 - 了解缓存何时会失效
最后修改于 2026年7月1日