主要观点:本文介绍在 Apache Arrow 的 Rust 实现中实现 StringView 并将其集成到 Apache DataFusion 中,显著提高了 ClickBench 基准测试中字符串密集型查询的性能,从 20%到 200%不等。
关键信息:
- StringView 基于避免一些字符串复制和使用内联前缀加速比较的简单想法,虽简单但直接实现会降低性能,需运用巧妙观察和勤奋工程来实现其实际好处。
- Apache Parquet 是存储大规模分析数据的事实格式,将其数据读入 Arrow StringArray 需复制和合并字符串字节,而读入 StringViewArray 可重用相同数据缓冲区。
- 最初实现从 Parquet 读取 StringViewArray 比 StringArray 慢,原因是 UTF-8 验证花费更多时间,通过优化将长度字节视为单个大字符串的一部分可提高性能。
- 从 Parquet 加载时避免字符串复制仍未达到预期性能,原因是一些隐式数据复制,通过移除隐式 API 并使用显式 API 可避免不必要的复制。
- Rust 编译器自动优化有时需要额外提示,构造短字符串在 StringViewArray 上比在 StringArray 上慢,通过生成 13 个函数副本避免函数调用可提高性能。
- 在 DataFusion 中对 ClickBench 查询 Q20 的评估表明,使用 StringViewArray 可使端到端查询性能提高 24%。
重要细节: - StringViewArray 由视图数组、缓冲区和缓冲区指针组成,不同长度的字符串存储方式不同。
- 基准测试显示加载 BinaryViewArray 比加载 BinaryArray 快近 2 倍,优化 UTF-8 验证后加载 StringViewArray 比加载 StringArray 快近 2 倍。
- 避免隐式复制需要跟踪数据流程,移除隐式 API 可帮助其他下游用户避免不必要的复制。
- 构造短字符串慢是因为编译器调用通用函数而不是直接使用 CPU 指令,通过生成多个函数副本可避免函数调用。
- 在 DataFusion 中对 ClickBench 查询 Q20 的评估结果表明 StringView 能有效提高端到端查询性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。