DuckDB UI 中的即时 SQL:如你所愿,即刻呈现结果
Live Demo:开始使用 MotherDuck - 使用全新即时 SQL 加速查询!立即注册!
即时 SQL 来了:加速编写即席查询
2025/04/23 - 8 分钟阅读
今天,我们发布 Instant SQL,这是一种编写 SQL 的新方式,它可以在你键入时更新你的结果集,以加快查询构建和调试速度——所有这些都具有零延迟,无需运行按钮。 Instant SQL 现已在 MotherDuck 和 DuckDB Local UI 中以预览版提供。
我们构建 Instant SQL 的原因很简单:编写 SQL 仍然过于繁琐和缓慢。 不是因为语言本身,而是因为我们与数据库交互的方式自 SQL 创建以来没有太大发展。 编写 SQL 不仅仅是语法问题——而是理解你的数据,知道要问什么,以及弄清楚如何到达那里。 这个过程是迭代的,而且很_难_。
"Instant SQL 将使我免于在我的 BI 工具中努力处理 SQL 的痛苦,在 BI 工具中,迭代速度可能非常慢。这让我可以在流程的早期阶段获得正确的数据,并且比等待图表渲染或清除分析缓存更快地获得反馈。" -- Mike McClannahan, CTO, DashFuel
尽管数据库引擎已经得到了很大的改进,例如列式存储、向量化执行以及像 DuckDB 这样可以扫描数十亿行数据的超快引擎的创建,但_构建_查询的体验并没有跟上。 我们仍然在文本编辑器中编写查询,点击运行按钮,然后等待结果。
在 MotherDuck,我们一直从多个角度解决这个问题。 去年,我们发布了 Column Explorer,它可以为你提供表中所有列和结果集的快速分布和摘要统计信息。 我们还发布了 FixIt,这是一个非常有效的 SQL AI 修复器。 MotherDuck 用户喜欢这些工具,因为它们可以加快数据探索和查询迭代的速度。
Instant SQL 不仅仅是对 SQL 工具的增量改进:它是一种与查询交互的全新方式——你可以立即看到你的更改,自然地进行调试,并且真正信任你的 AI 助手建议的代码。 不再等待。 不再需要上下文切换。 只有_流畅_。
让我们仔细看看它是如何工作的。
在你键入时生成预览结果
每个人都知道从头开始编写新查询的感觉。 起草、运行、等待、修复、再次运行——这是一个令人精疲力竭的循环,每天重复数百次。
Instant SQL 为你提供在你键入时更新的结果集预览。 你不再运行查询——你正在实时探索你的数据,保持一种分析流程状态,在这种状态下,你会产生最佳的想法。
无论你的查询是简单的转换还是复杂的聚合,Instant SQL 都可以让你实时预览结果。
实时检查和编辑 CTE
CTEs 易于编写,但难以调试。 你每天注释掉多少次代码来弄清楚 CTE 中发生了什么? 使用 Instant SQL,你现在可以点击浏览并立即在几秒钟内可视化任何 CTE,而不是花费数小时进行调试。 更好的是,你对 CTE 所做的更改会立即反映在所有依赖的选择节点中,从而为你提供有关修改如何级联通过查询的实时反馈。
分解复杂的列表达式
我们都经历过这种情况;你为一个重要的业务指标编写一个复杂的列公式,当你运行查询时,你会得到一个充满 NULL
的结果集。 然后你必须费力地逐块拆解它,以确定问题是你的逻辑还是底层数据。
Instant SQL 让你可以在_结果表_中分解你的列表达式,以准确地查明发生了什么。 你对查询所做的每次编辑都会立即反映在数据如何流经表达式树中。 这使得调试任何从复杂的数值公式到正则表达式都感觉毫不费力。
预览 DuckDB 可以查询的任何内容 - 不仅仅是表
Instant SQL 不仅适用于 DuckDB 表;它还适用于 MotherDuck 中的海量表、S3 中的 parquet 文件、Postgres 表、SQLite、MySQL、Iceberg、Delta – 你能想到的都可以。 如果 DuckDB 可以查询它,你就可以看到它的预览。
这是快速探索和建模外部数据的_最佳_方式。
在运行查询之前快进到有用的查询
Instant SQL 让你能够自由地测试和完善你的查询逻辑,而无需等待。 你可以快速地实时试验不同的方法。 当你对预览中看到的内容感到满意时,你可以运行查询以获得最终的具体化结果。 这种方法减少了你的 SQL 工作流程中的时间,将繁琐的编写-运行-等待循环转变为流畅的探索和发现过程。
立即预览 AI 驱动的编辑建议
所有这些工作流程改进对于人类来说都很棒,但如果你将 AI 功能添加到其中,它们会更好。 今天,我们还为 MotherDuck 用户发布了一个新的内联提示编辑功能。 你现在可以选择一段文本,点击 cmd+k(或 Windows 和 Linux 用户的 ctrl+k),用简单的语言编写一条指令,然后获得 AI 建议。
Instant SQL 使此内联编辑功能神奇地工作。 当你收到建议时,你会立即看到该建议已应用于结果集。 不再抛硬币并接受可能会破坏你辛勤工作的建议。
为什么以前没有人这样做过?
一旦我们有了 Instant SQL 的可行原型,我们便开始问自己:为什么以前没有人做过类似的事情? 事后看来这似乎很明显。 事实证明,你需要一组独特的要求才能使 Instant SQL 工作。
一种大大减少运行查询延迟的方法
即使你让数据库在几毫秒内返回结果,如果你将查询发送到 us-east-1,也不会有太大帮助。 DuckDB 的本地优先设计,以及有原则的性能优化和友好的 SQL,使得可以使用_你的计算机_来解析查询、缓存依赖项以及重写和运行它们。 结合 MotherDuck 的双重执行架构,你可以轻松地预览和查询大量数据,且延迟很低。
一种重写查询的方法
制作 Instant SQL 需要的不仅仅是高性能的架构。 即使 DuckDB 速度很快,实际的临时查询可能仍然需要超过 100 毫秒才能返回结果。 当然,DuckDB 也可以查询远程数据源。 我们需要一种本地缓存某些表引用样本并重写查询以指向这些样本的方法。
几年前,DuckDB 在 JSON 扩展中隐藏了一段魔法:一种通过 SQL 标量函数 从任何 SELECT 语句获取抽象语法树(或 AST)的方法。 这意味着任何工具制造商都可以使用 DuckDB 数据库内部的这个重要部分构建由解析器驱动的功能——无需从头开始编写自己的 SQL 解析器。
一种准确模拟查询的缓存系统
当然,在你键入时显示预览不仅仅需要知道你在查询中的位置。 我们已经实施了多种复杂的本地缓存策略,以确保结果立即出现。 将其视为一个预测你可能想看到什么并提前准备好的系统。 这些缓存技术的细节非常有趣,值得单独写一篇博文。 但足以说明,一旦缓存被激活,结果就会在你将手指从键盘上抬起之前实现。
如果没有这种技术能力的完美结合——快速的本地 SQL 引擎、解析器可访问性、精确的游标到 AST 映射以及智能缓存——Instant SQL 根本不可能存在。
一种预览查询中任何 SELECT 节点的方法
获取 AST 是向前迈出的一大步,但我们仍然需要一种方法来获取你在编辑器中的光标位置并将其映射到通过此 AST 的_路径_。 否则,我们就无法知道你对查询的哪个部分感兴趣。 因此,我们构建了一些简单的工具,将 DuckDB 的解析器与其分词器配对,以丰富解析树,然后我们使用它来查明所有节点、子句和 select 语句的开始和结束位置。 这种光标到 AST 的映射使我们能够向你显示你正在处理的 SELECT
语句的精确预览,无论它出现在复杂查询中的哪个位置。
尝试 Instant SQL
Instant SQL 现已在 MotherDuck 和 DuckDB Local UI 中以预览版提供。 试用一下,亲身体验一下当实时查询结果在你键入时触手可及时,SQL 的速度有多快。 我们的新的、基于提示的编辑功能也适用于 MotherDuck 用户。
我们很乐意听到更多关于你如何使用 Instant SQL 的信息,我们期待在社交媒体和 Slack 上听到你的故事和反馈。
PS:我们正在招聘!
在 MotherDuck,我们正在构建一个分析工作适用于每个人的未来——从像 Instant SQL 这样的新 UI 功能到为其提供支持的平台和数据库。 如果你对构建复杂、数据密集的界面充满热情,我们正在招聘,我们很乐意让你加入我们的行列,帮助我们使这些功能更加神奇。
内容
- 在你键入时生成预览结果
- 实时检查和编辑 CTE
- 分解复杂的列表达式
- 预览 DuckDB 可以查询的任何内容 - 不仅仅是表
- 在运行查询之前快进到有用的查询
- 立即预览 AI 驱动的编辑建议
- 尝试 Instant SQL
- PS:我们正在招聘!
立即开始使用 MotherDuck! 免费试用 21 天 开始使用