AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 225501
Accepted
Jigao
Jigao
Asked: 2018-12-21 10:49:31 +0800 CST2018-12-21 10:49:31 +0800 CST 2018-12-21 10:49:31 +0800 CST

为什么矢量化可以减少虚函数的使用?

  • 772

向量化查询对于获得高性能分析系统非常有帮助。

我知道矢量化可以对值块(SIMD 指令)执行所有操作,而不是一次解释一个查询表达式元组。
但是我怎么能理解,向量化可以减少虚函数的开销呢?


当我阅读慕尼黑工业大学的一篇论文时,我想到了这个问题:
Data Blocks: Hybrid OLTP and OLAP on Compressed Storage using both Vectorization and Compilation

查询评估效率的飞跃通常是通过使用向量化执行来实现的,在这种情况下,不是一次解释查询表达式元组,而是在值块上执行所有操作。其效果是减少了解释开销,因为实现块式操作的虚拟函数每次函数调用处理数千个元组,并且这些函数实现内的块循环受益于许多循环驱动的编译器优化,包括 SIMD 指令的自动生成。

这种表述也可以在其他 DBMS 论文中找到,因为矢量化是一种流行的方式。

这个问题与一般的 DBMS 相关,而 TUM 的论文与 相关HyPer,这是一个不太“著名”的 DBMS。我很乐意收到任何类型的示例和解释。如果我的表述有误,请随时对其进行编辑。

query optimization
  • 1 1 个回答
  • 172 Views

1 个回答

  • Voted
  1. Best Answer
    Josh Darnell
    2018-12-24T13:25:57+08:002018-12-24T13:25:57+08:00

    翻阅论文,答案似乎很简单:

    • 对于“基于行”(非矢量化)的操作,用于处理查询结果的(虚拟)函数必须每行调用一次。
    • 对于“基于批处理”(矢量化)的操作,(虚拟)函数每批调用一次,然后可以在虚拟函数实现中运行优化循环(通过减少调用这些函数的次数来减少虚拟函数开销)

    您提到的报价中主要包含

    ...实现块式操作的虚拟函数每次函数调用处理数千个元组...

    调用一次函数来处理数千行,比调用函数数千次,每行一次要便宜得多。

    在任何程序中,调用函数都有开销,尤其是虚函数(在查找表中查找实际函数实现的地址,错过某些编译时优化,因为实际实现函数直到运行时才知道,等等 - 请参阅在 C++ 中,虚函数为什么以及如何变慢?有关虚函数开销的更多讨论)。

    查看 SQL Server 基于批处理的查询处理的实现(我知道这篇论文是关于 HyPer,但一般原则成立),您可以找到其他资源来讨论在 CPU 方面每行与每批的成本节省。考虑这篇文章:

    列存储索引性能:BatchMode 执行

    它比较了基于行的处理:

    1. 查询以 ROW 模式执行。谓词被应用到 3580 行,一次一行,得到 1200 个符合条件的行
    2. ...实际的 CPU 成本是 15 毫秒...

    基于批处理的处理:

    1. 查询(特别是 SCAN 运算符)在 BatchMode 中执行。执行了两批,每批包含 900 行。谓词一次应用于 900 行
    2. ...实际执行时间 < 1 ms(可测量的最短时间)...

    由于多种原因,批量处理查询结果降低了 SQL Server 中的 CPU 成本,但虚拟函数调用开销可能是其中之一(尽管它可能不如对压缩数据进行操作、按批次应用谓词、计算聚合等重要)每批次等)。

    • 4

相关问题

  • oracle 中的 DBMS_REDEFINITION 与 EXCHANGE PARTITION

  • 两个相关表之间的查询

  • 日期对齐和对匹配提取最好用 TSQL 或 C# 完成?

  • LIKE 选择文字中任意位置独立存在的单词

  • 将 EXPLAIN 成本转换为(挂钟)运行时是否有好的“经验法则”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve