向量化查询对于获得高性能分析系统非常有帮助。
我知道矢量化可以对值块(SIMD 指令)执行所有操作,而不是一次解释一个查询表达式元组。
但是我怎么能理解,向量化可以减少虚函数的开销呢?
当我阅读慕尼黑工业大学的一篇论文时,我想到了这个问题:
Data Blocks: Hybrid OLTP and OLAP on Compressed Storage using both Vectorization and Compilation
查询评估效率的飞跃通常是通过使用向量化执行来实现的,在这种情况下,不是一次解释查询表达式元组,而是在值块上执行所有操作。其效果是减少了解释开销,因为实现块式操作的虚拟函数每次函数调用处理数千个元组,并且这些函数实现内的块循环受益于许多循环驱动的编译器优化,包括 SIMD 指令的自动生成。
这种表述也可以在其他 DBMS 论文中找到,因为矢量化是一种流行的方式。
这个问题与一般的 DBMS 相关,而 TUM 的论文与 相关HyPer
,这是一个不太“著名”的 DBMS。我很乐意收到任何类型的示例和解释。如果我的表述有误,请随时对其进行编辑。
翻阅论文,答案似乎很简单:
您提到的报价中主要包含
调用一次函数来处理数千行,比调用函数数千次,每行一次要便宜得多。
在任何程序中,调用函数都有开销,尤其是虚函数(在查找表中查找实际函数实现的地址,错过某些编译时优化,因为实际实现函数直到运行时才知道,等等 - 请参阅在 C++ 中,虚函数为什么以及如何变慢?有关虚函数开销的更多讨论)。
查看 SQL Server 基于批处理的查询处理的实现(我知道这篇论文是关于 HyPer,但一般原则成立),您可以找到其他资源来讨论在 CPU 方面每行与每批的成本节省。考虑这篇文章:
列存储索引性能:BatchMode 执行
它比较了基于行的处理:
基于批处理的处理:
由于多种原因,批量处理查询结果降低了 SQL Server 中的 CPU 成本,但虚拟函数调用开销可能是其中之一(尽管它可能不如对压缩数据进行操作、按批次应用谓词、计算聚合等重要)每批次等)。