数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。

作者:JORDAN TIGANI,DuckDB 公司 MotherDuck 联合创始人&CEO

本文和封面来源:https://motherduck.com/,爱可生开源社区翻译。

本文约 4500 字,预计阅读需要 15 分钟。

论数据库性能崇拜

从我在西雅图的家到我们在旧金山的办公室大约需要 4.5 小时。假设您建造了一架高超音速飞机,其最高速度比普通波音 737-MAX 快 10 倍(无论是否有额外的防风靠窗座椅)。当你考虑乘 Uber 去机场、排队安检、登机、在停机坪上滑行、起飞和降落、等待登机口、等待行李以及乘优步去办公室之后,你就已经完成了一些惊人的壮举工程,但可能只缩短了 20% 的总行程时间。很好,但我仍然参加不上上午 10 点的会议。

数据库行业一直专注于制造更快的飞机。与此同时,安检队伍越来越长,行李也经常丢失。如果您的数据位于有点不稳定的 CSV 文件中,或者您想要提出的问题很难用 SQL 表述,那么可能理想的查询优化器也无法帮助您。

性能是像我这样的数据库迷用来衡量数据库的最常见指标,并且像体育迷一样,我们倾向于选择我们支持的球队来对抗其他球队。如果您最喜欢的数据库赢得了基准性能测试战争,那么您就有了在饮水机旁边吹牛的权利。您可以炫耀那些有博客文章统计支持的数据,向任何愿意倾听的人证明您最喜欢的数据库是冠军。

一般来说,根据性能(特别是通用基准测试)选择数据库是一个糟糕的方法。您最好根据易用性、生态系统、更新速度或其与工作流程的集成程度来做出决策。最好的情况是,性能是完成某些任务所需时间的时间点视图;然而,最坏的情况是,它会导致您针对错误的事情进行优化。

基准大战结束

2019 年,GigaOm发布了比较云数据仓库的基准测试报告。他们在三大云供应商以及 Snowflake 上运行 TPC-H 和 TPC-DS。结果?Azure 数据仓库是迄今为止最快的,其次是 Redshift。Snowflake 和 BigQuery 远远落后。

当时,我正在研究 BigQuery,很多人都吓坏了…… 我们怎么会比 Azure 慢那么多呢?然而,结果与我们从用户那里得到的印象并不相符。每次客户对我们与 Azure 进行正面评估时,他们最终都会选择 BigQuery。当时的市场结果几乎与基准相反:Snowflake 和 BigQuery 最终的销量比 Redshift 好得多,而 Redshift 的销量比 Azure 好得多。

如果基准测试与客户体验不匹配,那么要么基准测试做错了,基准测试测试了错误的东西,要么最终证明性能并不那么重要。我们进行了很多探索,这不是第一次。GigaOm 人员非常擅长运行基准测试,而且方法也很合理。他们运行的基准测试 TPC-H 和 TPC-DS 是行业标准,并且被广泛的引用。它们是我们自己在内部运行的基准,用于判断性能,虽然人们可能会对数据大小或其与现实世界工作负载的相关性提出异议,但它们是最好的测试报告。

因此,如果基准很好地体现了性能,而客户最终在很大程度上购买了在基准上表现不佳的系统,那么它会让您相信也许还有比性能更重要的事情。

快意味着什么?

在我从事云数据库工作的 15 年中,我注意到整个行业的一种反智模式:构建数据库的人往往非常关注某人单击“运行”按钮和实际运行之间的时间。很容易理解为什么数据库人员只关注数据库服务器的相应时间;毕竟那是他们能掌控的范围。但真正对用户产生影响的是完成一项任务所需的时间,这两个时间这不是一回事。

在 BigQuery 中,我们将 JDBC 驱动程序的构建外包给了一家专门构建数据库连接器的公司。如果您不熟悉 JDBC,它们提供了程序员和商业智能工具用来连接数据库的通用接口。当时让一位知名专家构建界面是有意义的。

几年后,在无数客户投诉之后,我们意识到 JDBC 驱动程序中的错误正在影响性能。从我们的角度来看,查询运行得很快,只需一两秒。但是驱动程序轮询查询完成并提取结果的方式使得查询看起来花费了几秒钟甚至几分钟的时间。当存在大量查询结果时,这种影响会加剧,因为即使用户不需要查看所有结果,驱动程序通常也会一次一页地拉取所有结果。有时他们甚至会因为内存不足而崩溃。

我们的工程师花了很多年的时间来提高查询速度,将查询时间缩短了几分之一秒。但我们大多数用户使用的连接器增加的延迟就已经远远超过我们节省的延迟。更重要的是,我们对这个事实完全视而不见。Google 没有人真正使用 JDBC 驱动程序,虽然我们每天晚上都在运行着全套基准测试,但这些基准测试实际上并没有反映出我们的用户所看到的端到端性能。

就像醉汉在路灯下寻找钥匙一样,我们只关注我们可以在服务器上测量的性能。用户看到的查询时间对我们来说是不可见的,我们认为这是其他人的问题。要真正解决问题,而不仅仅是处理问题,需要我们重新构建对性能的看法。

表现是主观的

性能必须从用户的角度而不是数据库的角度来衡量。这是一个用户体验问题,就像任何用户体验问题一样,不能用一个数字来描述。这让很多人感到惊讶,因为他们认为性能就像赛车一样是客观的事情。仅仅因为您可以说兰博基尼比普锐斯更快,他们相信您也应该能够说我的数据库比您的数据库更快。但就像兰博基尼可能无法让我比普锐斯(或自行车,如果有交通)更快地工作一样,数据库的实际工作负载将决定哪一个更快。

主观性受到了不好的批评;人们将其与这样的说法联系起来:“好吧,没有办法知道哪一个更好,所以我们选择哪一个并不重要。” 但仅仅因为福特 F150 皮卡和特斯拉 Roadster 之间的差异是主观的,并不意味着我对两者的体验是相同的。数据库也是同样的道理;如果我们说 Clickhouse 和 Redshift 之间的性能差异是主观的,并不意味着它们是等效的。这只是意味着哪一个更快取决于它们的使用方式。

几年前,Clickhouse 发布了 Clickbench,该基准测试表明 Clickhouse 比他们测试的几十个数据库更快。这让我感到惊讶,因为当时我在 SingleStore 工作,我们相信我们的速度比 Clickhouse 快得多。在深入研究基准之后,我们发现该基准没有执行任何 JOIN,因此在单个表中进行操作,并且还严重依赖于对不同项目进行计数。

虽然您可能认为发布仅执行单表扫描的基准测试很俗气,但 Clickbench 实际上在代表许多实际工作负载方面做得相当好。如果您进行大量日志分析并需要计算网站的不同用户,这可能是性能的良好代理。也就是说,如果您使用星型模式运行更传统的数据仓库工作负载,Clickbench 将会产生误导。

供应商基准往往关注供应商做得好的事情。下图是来自“公平基准测试被认为很困难” 的图表,描述了典型的供应商基准测试结果。

数据库基准测试存在大量陷阱,经验表明基准测试通常在捕获广泛的用户感知性能方面表现不佳。例如,BigQuery 在基准测试中表现得很差,但很多人的实际体验是性能很神奇。BigQuery 亲自表现得很好,因为它没有任何旋钮,并且在很大程度上是自我调整的。高度调优的 SingleStore 实例在大多数任务中都会压垮 BigQuery,但是您有时间花在调优架构上吗?当您添加新的工作负载时会发生什么?

DuckDB 网站曾经有一个免责声明,上面写着:“请不要抱怨性能,我们在努力提高速度之前会先关注正确性。” 并非所有数据库都采用相同的方法。你可以通过去掉安全气囊、牵引力控制、溃缩区、排放控制等安全装置来让汽车跑得更快。但大多数人不想这样驾驶汽车。数据库也不例外;如果删除溢出检查、不刷新写入、为某些操作提供近似结果或不提供 ACID 保证,则可以使它们更快。一些在这些基准测试中表现良好的系统应用了这些捷径,但除非在受控环境下,否则我不想使用它们。

未来的变化

当您选择数据库时,该数据库在该时间点并没有冻结。您可能最终会坚持自己的决定数年。从现在到明年,数据库的性能和功能将会发生很大变化,从现在到五年后更是如此。

因此,一个非常重要的变量不仅是数据库现在可以做什么,还在于未来一年能够做什么。如果数据库中的错误导致您选择竞争对手,那么在短短几周内,如果该错误已被修复,那么这将看起来是一个愚蠢的原因。这对于性能来说也是如此。如果两个不同的数据库以不同的速度改进,那么您最好选择移动速度更快的数据库。未来的你会感谢你。

没有魔豆

如果你采用一堆数据库,所有这些数据库都得到积极维护,并迭代它们几年,性能将会趋于一致。如果 Clickhouse 正在应用一种能够使其在扫描速度方面具有优势的技术,那么 Snowflake 可能会在一两年内拥有这种优势。如果 Snowflake 添加增量物化视图,BigQuery 很快就会跟进。随着时间的推移,重要的性能差异不太可能持续存在。

尽管这些公司的工程师都很聪明,但他们都没有任何魔法或无法在其他地方复制的东西。每个数据库都使用不同的技巧来获得良好的性能。一种可能将查询编译为机器代码,另一种可能将数据缓存在本地 SSD 上,第三种可能使用专门的网络硬件进行洗牌。只要有时间,任何人都可以实施所有这些技术。如果它们运作良好,它们可能会出现在任何地方。

Fivetran 的首席执行官 George Fraser 发表了一篇有趣的文章,比较了主要数据仓库供应商随时间的表现;虽然 2020 年的分散程度相当大,但到 2022 年,它们会更加紧密地聚集在一起。2020 年最快 8 秒,最慢 18 秒,2022年有 3 家厂商在 7 秒左右,最慢 9 秒。

当然,这条规则需要注意的是,架构差异很难克服。与共享磁盘相比,无共享数据库处于劣势,Redshift 花了很多年才切换到主要共享磁盘架构。依赖于将元数据持久保存到对象存储的 Lakehouse 将很难快速更新;这是内置于模型中的。但这些类型的差异往往会体现在利润率上。例如,从长远来看,Redshift 没有比 Snowflake 更快或更慢的根本原因。

问题出在椅子和键盘之间以及键盘和数据库之间

对于用户来说,衡量性能的重要指标是他们提出问题和得到答案之间的时间;这可能与数据库运行查询所花费的时间有很大不同。

如果你退后一步,从他们的角度思考,你可以使用更多的手段来实现最大限度地缩短问题提出和回答之间的时间的目标。您可以更轻松地提出问题。您可以更轻松地将查询结果转换为他们可以理解的内容。当他们没有提出正确的问题时,您可以帮助他们获得反馈。您可以帮助他们了解数据何时出现问题。您可以帮助他们在正确的位置以正确的形式获取所需的数据,以便能够首先提出问题。虽然这些通常不被认为是性能问题,但与更好的查询计划相比,改进可以在更大程度上加快分析师和数据工程师的工作流程。

Snowflake 在使编写查询变得更容易方面做得非常出色。尽管许多 SQL 方言都坚持语法一致,并且应该有“一种方法”来完成所有事情,但 Snowflake 设计者的目标是让用户键入的 SQL “正常工作”。例如,在 Snowflake SQL 中,如果要计算两个日期之间的差异,可以使用 DATEDIFF 或 TIMEDIFF;两者都适用于任何合理的类型。您可以指定粒度,也可以不指定。您可以围绕粒度使用引号,也可以不使用引号。因此,如果您只是输入查询,只要可以收集意图,它就应该“正常工作”。这是分析师喜欢 Snowflake 的原因之一,因为他们不必花时间在文档中查找内容。

数据并不总是采用方便查询的格式。世界上大量的数据都存储在 CSV 文件中,其中许多文件的结构很差。尽管如此,大多数数据库供应商并没有认真对待它们。在 BigQuery 中,我编写了第一个 CSV 拆分器,当发现它是一个比预期更棘手的问题时,我们派了一位新的研究生工程师来解决这个问题。它从来都不是很好,无法进行推理,并且如果不同的文件具有稍微不同的模式,就会感到困惑。事实证明,CSV 解析实际上很困难。

如果使用两个不同数据库的两名工程师需要读取 CSV 数据并计算结果,则能够最轻松地正确提取 CSV 文件的工程师可能会第一个得到答案,无论他们的数据库执行查询的速度有多快。因此,CSV 文件推断可以被视为一项性能功能。

数据库处理结果的方式对用户体验有着巨大的影响。例如,很多时候人们运行“SELECT *”查询来尝试了解表中的内容。根据数据库系统的架构方式,此查询可以是瞬时的(返回第一页和游标,如 MySQL),对于大型表可能需要数小时(如果必须在服务器端复制表,如 BigQuery) ),或者可能会耗尽内存(如果它尝试将所有数据拉入客户端)。客户端是否与服务器有长时间运行的连接,这可能会出现网络中断的问题?或者它们进行轮询,这可能意味着查询可以在轮询周期之间完成,并使查询显得更慢?

综上所述

最成功的数据库公司没有一家是通过比竞争对手更快而取得成功的。Redshift 曾一度称霸,而让 Snowflake 进入市场的是可维护性,而不是基准测试的性能。以性能为主要卖点的数据库在市场上表现不佳。让工作变得容易完成的数据库表现要好得多。

总结一下:

  1. 没有魔豆;除非架构存在差异,否则性能将随着时间的推移而趋于一致。
  2. 数据库引擎以截然不同的速度发展;行动最快的人将是最后的胜利者。
  3. 当心最关心性能的数据库供应商;从长远来看,这会减慢他们的速度。
  4. 没有单一的数据库性能指标;“快速”数据库可能会严重影响您的工作负载。
  5. 数据库的重要特征是从想法到答案的速度,而不是从查询到结果的速度。

更快的查询显然比更慢的查询更可取。但如果您选择数据库,最好确保您是根据原始速度以外的因素做出决定的。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

autojsx使用

工具: 投屏软件:https://www.sigma-rt.com/tc/download/ autojsx:https://github.com/kkevsekk1/AutoX/releases 开发文档:http://doc.autoxjs.com/#/ 开发工具:https://code.visualstudio.com/ vscode插件&#xff1a…

《世界之外》玩家闹上315,乙游打响维权大战

315维权微博的评论区,竟然被举报网易的玩家占领了。 玩家举报网易乙游《世界之外》虚假宣传侵害消费者权益,在游戏中设置排行榜和专属商店将玩家分为三六九等,诱导玩家消费氪金,强烈要求网易打开退款通道。 目前大批玩家举报的举…

【Leetcode】1793. 好子数组的最大分数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个整数数组 n u m s nums nums (下标从 0 0 0 开始)和一个整数 k k k 。 一个子数组 ( i , j ) (i, j) (i,j) 的 分数 定义为 m i n ( n u m s …

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks:检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问:opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么? 2.3 DDP mode&…

HarmonyOS NEXT应用开发之swiper指示器导航点位于swiper下方

介绍 本示例介绍通过分割swiper区域,实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 加载完成后swiper指示器导航点,位于显示内容下方。 实现思路 将swiper区域分割为两块区域,上方为内容区域,下方为空白区域。…

Linux权限维持后门及应急响应

本次应急响应实验用kali和centos7来充当攻击机和靶机 kali:192.168.10.130 centos7:192.168.10.155 前提: 用kali连接到centos7上面ssh root192.168.10.155 一、SSH软链接 任意密码登录即可发现程度:|||||| ln -sf /usr/sbi…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了,但除此之外仍有更多的纹理类型等着我们探索。在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map)。 简单来说,立方体贴图就是一个包含了…

【论文阅读】Improved Denoising Diffusion Probabilistic Models

Improved Denoising Diffusion Probabilistic Models 文章目录 Improved Denoising Diffusion Probabilistic Models概述Improving the Log-likelihoodLearning ∑ θ ( x t , t ) \sum_{\theta}(x_{t}, t) ∑θ​(xt​,t)Improving the Noise ScheduleReducing Gradient Nois…

AV1:帧内预测(一)

​VP9支持10种帧内预测模式,包括8种角度模式和非角度模式DC、TM(True Motion)模式,AV1在其基础上进一步扩展,AV1帧内预测角度模式更细化,同时新增了部分非角度模式。 扩展的角度模式 AV1在VP9角度模式的基础上进一步扩展&#xf…

Linux系统学习总结(上)

B站大学地址:第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…

C++ Primer Plus第十七章笔记

目录 1. C输入和输出概述 1.1 流、缓冲区和iostream 1.2 重定向 2. 使用cout进行输出 2.1 修改显示时使用的计数系统 2.2 调整字段宽度 2.3 填充字符 2.4 设置浮点数的显示精度 2.5 打印末尾的0或小数点 2.6 setf() 2.7 头文件iomanip 3. 使用cin进行输入 3.1 cin…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生,那Web组态软件又是什么呢?本文将对Web组态可视化软件(下称“Web组态软件”)做简单介绍,可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器,还有哪些功能模块?又…

嵌入式汇编语言简介

嵌入式汇编语言是一种在嵌入式系统开发中广泛使用的编程语言,它直接操作底层硬件资源,具有高效性和灵活性。本文将介绍嵌入式汇编语言的基本概念、特点以及应用场景。 以下是我整理的关于嵌入式开发的一些入门级资料,免费分享给大家&#xf…

Spring之@Value注解

前言 Value注解在Spring的依赖注入中占据重要地位,这里对Value注解的作用进行演示以及扩展 作用 注入字符串注入属性注入bean其他 代码准备 创建两个普通的bean Component public class ValueComponent { } Component public class Foo {private String sign;public Foo…

Linux编译器--gcc/g++的使用

1. gcc与g gcc与g分别是c语言与c代码的编译器,但同时g也兼容c语言。 我们知道在Linux中,系统并不以文件后缀来区分文件类别。但对于gcc与g等编译器而言却是需要的。Linux中c代码文件的后缀是.c,c代码文件的后缀是.cpp(.cc)(.cxx)。 在Linu…

linux安装Redis且搭建主从、哨兵、集群以及使用(超详细)

一.Redis简介 1.NoSQL简介 ​ 目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作,I/O操作是主要影响程序执行性能原因之一,连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作,能够明显的提升程…

Nodejs 第五十八章(大文件上传)

在现代网站中,越来越多的个性化图片,视频,去展示,因此我们的网站一般都会支持文件上传。 文件上传的方案 大文件上传:将大文件切分成较小的片段(通常称为分片或块),然后逐个上传这…

体育运动直播中的智能运动跟踪和动作识别系统 - 视频分析如何协助流媒体做出实时决策

AI-Powered Streaming Vision: Transforming Real-Time Decisions with Video Analytics 原著:弗朗西斯科冈萨雷斯|斯特朗(STRONG)公司首席ML科学家 翻译:数字化营销工兵 实时视频分析通过即时处理实时视频数据&…

【故障排查】10分钟解决Quartz重复调度的疑难杂症

我司使用Apache DolphinScheduler作为调度框架很久了,感兴趣的小伙伴可以看看这些干货文章: 因为之前监控到会出现重复的调度的问题,所以此文记录排查重复调度问题的全过程,希望对社区其他的小伙伴能够起到抛砖引玉的作用&#x…

1.中医学习-总论

目录 1.为什么要学中医 2.什么是中医 介绍 中医例子1: 中医例子2: 中医最高境界“大道至简” 中医讲究的是本质 中医核心:阴阳、表里、寒热、虚实 ​编辑医不叩门 3.阴阳 1.一天中的阴阳 2.一年中的阴阳 3.阴阳之间的关系 4.阴阳四季的变化 …