跳转到主要内容
理解 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. 合理使用缓存 - 了解缓存何时会失效