什么是DuckDB?嵌入式分析、SQL和用例

什么是DuckDB?

无抓取网页解锁器检索分析师可以验证的公共网页内容,保存为类型文件,并在本地使用DuckDB查询。

摘要

  • DuckDB是一个在进程中运行的分析SQL数据库。 一个应用程序链接或导入引擎,而不是将每个查询发送到单独的数据库服务器。
  • 它旨在进行分析扫描和转换。 面向列的执行和矢量化处理适合过滤、联接、聚合和文件分析。
  • DuckDB可以直接查询常见数据文件。 CSV、JSON和Parquet工作流程可以在不将每条记录先加载到长时间运行的服务中的情况下开始。
  • 嵌入式并不意味着事务替换。 操作写重的服务和共享多用户平台有不同的协调需求。
  • 最佳适配是一个有界的分析单元。 笔记本、命令行分析、本地管道、测试和应用程序嵌入分析得益于低设置摩擦。

DuckDB定义

DuckDB是一个分析关系数据库管理系统,设计为在另一个进程内部运行。它公开SQL和客户端API,同时引擎在命令行程序、笔记本内核、服务进程或加载它的应用程序中本地执行。这种嵌入模型从许多单节点分析工作流程中移除了一个单独的服务器。

引擎专注于在线分析处理:扫描列、过滤许多行、连接关系和计算聚合。它可以通过连接器读取支持的文件格式和数据结构,然后将查询的部分推向源,以便不必要的列和行不会经过每个阶段。这里使用的主要术语遵循 DuckDB项目概述, 它为概念提供了一个具体的技术边界,而不是将其视为营销标签。

有用的定义也说明了概念不做什么。DuckDB不是一个托管数据仓库服务、分布式集群调度器,或一个协调许多并发应用程序写入者的操作数据库的一般替代品。它可以保留数据库,但部署和共享选择仍然是应用程序所有者的责任。保持该边界可见可以防止架构图为属于另一层的组件分配保证。

DuckDB如何执行分析查询

DuckDB查询在宿主进程内经历解析、绑定、逻辑规划、优化和物理执行。对本地内存和文件的直接访问可以消除客户端-服务器数据库所需的序列化边界。

  1. 宿主应用程序通过客户端API或命令行会话打开一个内存或持久的DuckDB数据库。
  2. SQL被解析并绑定到表、视图、文件或已知类型的注册内存对象。
  3. 优化器重写逻辑计划以减少扫描数据,并选择联接和聚合策略。
  4. 矢量化操作符处理批量列值,并可能使用多个CPU核心进行适当的工作。
  5. 结果保留在宿主进程中,或通过互操作层移动到DataFrame、Arrow表、文件或应用程序消费者。

进程内边界是中心设计选择。它简化了本地部署,并可以减少数据移动,但进程崩溃、内存限制、文件系统行为和应用程序生命周期直接影响数据库。资源控制应与查询保持相同的操作设计。关于此行为的详细文档可以在 DuckDB可嵌入数据库论文中找到。来源有用,因为它描述了实际的执行或数据模型,而不是依赖于松散的类比。

DuckDB架构一瞥

特征DuckDB方法实际意义
部署嵌入宿主进程本地分析单元低设置
主要工作负载分析SQL适合扫描、联接和聚合
数据访问数据库表、文件和集成分析可以在现有数据附近开始
执行列式和矢量化处理批量而不是一次一个值
缩放边界单主机或进程上下文内存、存储和共享需要明确的设计

当分析单位属于一个进程、且数据可以从该主机访问时,嵌入模型是一种优势。共享服务、严格的多租户隔离或集群规模计算可能需要不同的数据库边界,即使 DuckDB 在准备或测试中仍然有用。

DuckDB 最适合的场景

笔记本和本地分析

分析师可以在文件和数据帧上运行 SQL,而无需提供单独的数据库服务。

管道转换

一个作业可以读取分区文件、连接参考数据、聚合记录,并在一个过程中写入整理后的输出。

应用嵌入式分析

桌面工具、数据产品和服务可以包括靠近其数据的分析查询能力。

测试和可重复性

一个小型持久数据库或固定文件集可以使开发和持续检查中的转换更容易执行。

这些用例共享一个选择规则:选择 DuckDB,因为它的执行和所有权模型与工作负载相匹配,而不是因为名称听起来更先进。当 SQL 表达能力和本地分析执行简化工作流时,选择 DuckDB。当用户需要独立扩展、集中工作负载管理、高可用性或多个并发写入者时,选择服务边界。

文件、内存和进程边界

采用决策应该定义隔离单位。决定一个笔记本、批处理作业、桌面应用、请求或长时间运行的服务是否拥有数据库连接、文件、内存预算和结果生命周期。

  • 早期推送过滤器和投影。 仅读取分析结果所需的行和列。
  • 保持大型结果为列式形式。 避免在没有必要的情况下将紧凑的分析结果转换为数百万个主机语言对象。
  • 控制内存和溢出位置。 主机进程和查询引擎共享机器资源,应该有明确的预算。
  • 将文件视为数据集。 分区名称、模式、版本和清单决定直接文件查询是否是可重现的。
  • 定义写入者所有权。 并发进程不应假设对一个本地数据库文件的无限制共享写入。

Parquet 是一个常用的合作伙伴,因为它的列式布局和元数据允许分析引擎避免读取无关的列,有时跳过行组。文件质量、分区策略和模式一致性仍然重要;开放格式并不会自动创建受管理的数据集。相关的主要参考是 Apache Parquet 文档, 它阐明了这一选择背后的存储、执行或互操作性假设。

DuckDB 的误用和失败模式

DuckDB 很容易启动,这可能会掩盖生产假设。一个在一个文件上工作的笔记本尚未定义内存限制、输入身份、模式漂移、共享或为计划管道的恢复。

  • 材料化所有内容。 将完整查询结果转换为主机对象会占用大量内存,消除列式优势。
  • 将文件路径视为治理。 单独的路径并不能识别来源版本、模式、所有者、质量或保留。
  • 假设服务器语义。 嵌入式引擎共享主机进程生命周期,并不提供每种托管服务的行为。
  • 忽略类型漂移。 CSV 推断和更改 JSON 字段可能会改变结果,除非控制摄取类型。
  • 基准测试缓存的玩具数据。 有用的测试包括代表性文件、连接、结果移动、冷读取和下游工作。

一个失败应该追溯到最小的责任层。当作业变慢时,检查查询计划、扫描的文件、推送的过滤器、物化的中间状态、内存、溢出路径和结果转换,然后再更换引擎。此做法产生有用的纠正措施,而不是模糊的指示去增加更多容量。

使用 DuckDB 查询收集的网络数据

一个紧凑的网络数据工作流程可以检索经过批准的页面,提取类型观察,写入分区 Parquet,并使用 DuckDB 查询结果。这些阶段应保持分离,以避免将收集问题误认为 SQL 或模式问题。

对于公共网络输入,获取层应记录请求的 URL、最终 URL、采集时间、响应模式以及内容检查,然后再开始下游处理。规范化记录应保留源 URL、观察时间、提取版本和稳定的业务关键字,以及分析字段。这样的交接使分析师能够获取可重现的源记录,并使收集行为与解释保持分离。

Scrapeless 处理开头句子中描述的托管网络采集步骤。该应用仍然拥有源批准、字段定义、工作负载范围、保留、访问控制和验证。Scrapeless 检索请求的公共内容;解析代码定义字段;DuckDB 执行本地分析工作;周围应用拥有权限、资源限制、验证和发布。这些层之间的明确合同使后续更改更容易进行测试。

当用例需要审计能力时,管道应该同时保留原始证据和整理后的输出。原材料支持在解析器或模式更改之后重新处理;整理后的表支持稳定的分析。根据需要保留源证据,但要查询整理后的类型文件以进行重复分析,以便 HTML 或演示更改不会变成静默的指标变化。这两种表示回答不同的操作问题,不应被误认为重复。

DuckDB采用清单

在设计评审过程中使用以下问题。书面回答比假定的默认值更有价值,因为它揭示了团队在DuckDB上的分歧。

  • 工作负载是否需要在一个进程内进行分析SQL?
  • 输入文件存放在哪里,如何识别版本?
  • 哪些过滤器和投影可以向源推进?
  • 内存和临时存储预算是多少?
  • 如何测试模式和空值行为?
  • 谁负责写入持久数据库文件?
  • 结果在进入主机语言后有多大?
  • 哪些需求会迫使管理或分布式服务边界?

当一个主机能够访问受管数据、SQL清晰地表达转换,并且进程边界提供所需的隔离和生命周期时,DuckDB是一个很好的选择。工作负载形状、数据量、服务限制或消费者期望发生变化后,请重新审视答案。对一个探索性批处理来说合理的架构,可能不适合持续的生产路径。

结论

DuckDB是一个嵌入式分析SQL引擎,将列存、矢量化查询执行与文件和应用内存紧密结合。它适用于本地分析、管道作业、笔记本、测试和嵌入式数据产品。成功使用仍然需要受管输入、明确的资源限制、受控结果移动以及共享和写入的清晰边界。根据分析单元的形状选择,而不仅仅是出于设置的方便。

准备好在本地查询新鲜的网络数据了吗?

检索经过批准的公共页面,保存来源,并将手动输入的文件交给嵌入式DuckDB分析工作流。

今天注册并获得 $5的免费信用无需信用卡.

领取您的$5信用→

常见问题

DuckDB是数据库还是查询引擎?

DuckDB是一个关系数据库管理系统,带有分析SQL查询引擎。它可以使用内存或持久数据库存储,并可以查询支持的外部文件和数据结构。仅称其为查询引擎忽略了持久性和目录功能,而称其为服务器数据库又忽视了其嵌入式进程模型。

DuckDB与SQLite有何不同?

两者都可以在应用程序内运行,但其主要工作负载有所不同。SQLite广泛用于事务性应用数据,而DuckDB设计用于分析扫描、连接和聚合。正确的选择取决于工作负载和并发需求;一个应用程序可以把每个用于不同的职责。

DuckDB可以在不先导入的情况下查询Parquet吗?

可以。DuckDB可以直接查询支持的Parquet文件,这使基于文件的分析工作流程变得方便。直接访问仍然需要稳定的文件标识、兼容的模式、适当的权限和合理的分区。重复的生产使用可能受益于视图、清单或使这些假设明确的整理表。

DuckDB可以替代云数据仓库吗?

有时对于一个有界的单节点工作负载,但不能作为全面替代。管理的仓库提供服务级别共享、工作负载控制、集中安全性、弹性基础设施和嵌入式引擎不会自动创建的操作功能。DuckDB可能会补充仓库用于本地准备、测试或边缘分析。

DuckDB在网络爬取后有用吗?

有。经过批准的收集步骤将公共页面转换为输入记录后,DuckDB可以使用SQL过滤、连接、聚合、验证和写入分析文件。保持检索、解析和查询责任分开,并保留来源,以便结果可以追溯到捕获的源和提取版本。

参考文献