矢量化查询对于获得高性能的分析系统是非常有用的.
我知道向量化可以对值块(SIMD指令)执行所有操作,而不是一次解释查询表达式元组。
但是我怎么理解,矢量化可以减少虚拟函数的开销呢?
当我读到慕尼黑大学的一份报纸时,我突然想到了这个问题:
数据块:使用矢量化和编译的压缩存储的混合OLTP和OLAP
查询计算效率的跳升通常是通过使用矢量化执行来实现的,在这种情况下,所有操作都是在值块上执行的,而不是一次解释查询表达式元组。这种效果减少了解释开销,因为实现分块操作的虚拟函数每个函数调用处理数千个元组,而这些函数实现中块上的循环受益于许多循环驱动的编译器优化,包括SIMD指令的自动生成。
这种公式也可以在其他DBMS文件中找到,因为矢量化是一种流行的方法。
这个问题是与通用数据库管理系统有关的,而TUM的论文是与HyPer
相关的,它不是一个那么“有名”的数据库管理系统。我很高兴收到任何类型的例子和解释。如果我的配方有问题,请随意编辑。
发布于 2018-12-23 21:25:57
看一看论文,听起来答案就像这样简单:
大部分都在你提到的引文中。
...virtual函数实现分块操作,每个函数调用处理数千个元组.
调用一个函数一次,处理数千行,比调用该函数数千次要便宜得多,每一行都调用一次。
在任何程序中,调用函数都有开销,特别是虚拟函数(在查找表中查找实际函数实现的地址,忽略某些编译时优化,因为实际实现函数直到运行时才知道,等等--有关虚拟函数开销的更多讨论,请参见在C++中,为什么以及如何使虚拟函数变慢? )。
看看Server实现的基于批处理的查询处理(我知道这篇文章是关于HyPer的,但一般原则是成立的),您可以从CPU的角度找到讨论每行与每批处理成本节约的其他来源。考虑一下这个职位:
它比较了基于行的处理:
以批处理为基础:
因此,批量处理查询结果可以降低SQL Server中的CPU成本,原因有很多,但虚拟函数调用开销可能是其中之一(尽管它可能不像对压缩数据进行操作、应用每批谓词、计算每批聚合等等)。
https://dba.stackexchange.com/questions/225501
复制相似问题