跳转到内容

结果与图表 ​

English

编辑器下方的面板有三个标签页:结果、图表 和 概览。标签页右侧是结果的规模(N 行 · M 列)以及 导出 CSV 和 导出 Parquet 两个按钮。

编辑器工具栏上 执行计划 和 性能分析 按钮的输出也显示在 结果 标签页里,见执行计划与性能分析的输出。

结果表格 ​

结果表格最左侧是 # 行号列,其后是查询结果的各列,数值列右对齐。每列的初始宽度根据表头和前 200 行内容计算,中日文字符按两个字宽计。在默认界面大小下,列宽介于 80 到 360 像素之间,其他大小按比例缩放。可以拖动调整列宽,但 # 列宽度固定。列的总宽度超过面板时,下方会一直显示横向滚动条。

点击列标题上的箭头,按这一列给已加载的行排序:先降序,再升序,第三次恢复查询原来的顺序。数值列按数值排,其余按文本排(ISO 格式的日期和时间因此也能排对),NULL 排在最后,值相同的行保持查询原来的顺序。过滤不会打乱排序,下一次的结果从未排序开始。排序和过滤一样只在本地进行:要对超过已加载行数的结果排序,请在 SQL 里用 ORDER BY。

单元格显示 ​

值显示为
NULLNULL 字样,颜色较浅
BLOB<blob N bytes>
GEOMETRY<geometry N bytes>
值为整数的浮点数3.0
时间戳2026-09-17 04:21:09.5——UTC 时间,不是本地时间;小数部分有几位就显示几位(TIMESTAMP_NS 最多九位)
IntervalDuckDB 的写法,如 1 day 02:00:00
List / struct / map格式化显示

在 SQL 里比较时间戳不受影响;直接看表格里的时间时,别忘了这是 UTC。

过滤 ​

过滤框在已加载行的所有单元格中查找包含关键词的内容,不区分大小写。过滤只在本地进行,不会重新查询数据库。因此,它只作用于已加载的行,不代表完整查询结果。

输入关键词后按 Enter 才会过滤,打字时不会逐字刷新;清空输入框即恢复全部行。过滤生效时,过滤框旁边显示 显示行数 / 总行数 行,例如 120 / 5000 行。

行数上限 ​

结果达到以下任一上限,就会被截断:

  • 100,000 行
  • 2,000,000 个单元格:400 列的结果最多只生成约 5,000 行

只限行数,控制不住计算量,所以另设了单元格上限。对高基数列做 PIVOT 时,每个不同的值都会生成一列,要格式化的单元格可能多达上千万,界面看上去就像卡死了。

结果被截断时会出现一条横幅,注明实际加载了多少行。没有分页,也没有“加载更多”,需要更多数据时请缩小查询范围。

复制 ​

鼠标移到单元格上会出现复制按钮。右键点击单元格,还可以选择 复制单元格、复制整行(用制表符分隔)或 复制整列(每行一个值,按显示顺序)。右键点击行号可复制整行。复制遵循当前的过滤和排序;仪表盘的表格也提供这三个复制操作。不能框选多个单元格,也没有“复制为 SQL”;要复制更多内容,请用导出。

导出 ​

点 导出 CSV 或 导出 Parquet 会弹出一个小对话框,路径框里默认填好了 ~/Desktop/export.csv 或 ~/Desktop/export.parquet。

有两点需要注意:

  • 导出时会重新运行当前结果对应的 SQL,所以文件里是完整的查询结果,既不受过滤影响,也不受表格截断影响。
  • 没有文件选择窗口,同名文件也不会提示覆盖。输入路径,就直接写入。

图表 ​

在你选列之前,图表直接用表格里已有的行来画,顺序与查询返回的一致,不做聚合。用 X、Y 和 拆分 菜单选列后,则由 DuckDB 对完整结果分组。

图表上方的类型选择默认是 自动,按结果的列来选:

结果里有自动画出
一个纬度列和一个经度列地图
时间类型的第一列(date / timestamp)面积图;第 0 列为 x 轴,每个数值列画一条序列
其他柱状图;第 0 列为标签,第一个数值列为数值

注意,“数值列”也包括第一列。如果第 0 列是数字,比如小时、年份或 ID,柱状图会把它当作数值,而不是标签。要让它做标签,先转成文本:year::VARCHAR,或 format('{:02d}:00', hour(ts))。

柱状图、折线图、面积图 和 散点图 对任何结果都能直接切换;第一列不是时间的结果还可以选 饼图,有坐标的结果可以选 地图。选择会跨次执行保留;新结果画不了所选类型时(比如没有坐标却选了地图),图表退回自动的选择,但不会忘记你选的类型。

选择列 ​

图表上方的 X、Y 和 拆分 菜单决定画什么。Y 可以选行数,或者数值列的求和、平均、最小值、最大值。之后由 DuckDB 对完整结果(而不只是已加载的行)分组,保留最大的 200 个类别(或前 50,000 个有序值)和最大的 12 条序列,并用提示说明略去了什么。

  • 选了 拆分 后,图表类型里会多出 堆叠柱状图 和 热力图,饼图 则不再提供。
  • 有可分箱的数值时会提供 直方图,由 DuckDB 对完整结果分箱。
  • 复制为 .dash 把你选的内容复制成 query 和 plot block,在仪表盘里能画出同一张图。

没有选列时,如果结果被截断,图表会注明 仅基于表格已加载的前 N 行绘制,并非完整结果。被截断的时间序列会在后台重新运行,并对全部行取均值。

图表类型与限制 ​

饼图 按标签画第一个数值列,从大到小。零、负数和缺失的值不画成扇区,会有提示说明有几行;超过 8 个扇区时,最大的 7 个保留,其余合并成"其他"。

地图 按列名识别坐标:

  • 纬度:lat、latitude,或任何包含这些词的名字(geo_lat、start_lat);纬度 也可以。
  • 经度:lng、lon、long、longitude,同理;经度 也可以。

每一行是一个点,用 Web Mercator 投影,范围自动贴合这些点,背景是标了度数的经纬网;有取值不多的文本列时,按它给点着色。鼠标移到点上可以看到这一行。

点的下面可以画一层 OpenStreetMap 底图,在 显示 → 在线底图(OpenStreetMap) 里打开。它默认关闭,因为加载瓦片需要联网:瓦片请求大致能看出你在看哪片区域,但不会带上任何一行数据。瓦片缓存一周;离线时只画经纬网。

数值位置不是数字的行(例如 NULL)不参与绘图。

超出以下限制时,图表标题下方会有一行提示:

限制处理方式
12 条序列多出的数值列不画
1,500 个数据点数据分桶,每桶取平均值
200 根柱子超出的柱子直接截掉,不合并
8 个饼图扇区最小的几个合并成"其他"
20,000 个地图点超出的点不画

标题上总会写明画了多少个数据点。判断曲线走势之前,先看一眼这个数。

列概览 ​

概览 标签页一次描述当前结果的每一列:填充了多少、有多少种取值、取值范围,以及取值的分布。

顶部一行是 当前查询结果 · N 行 · M 列 · 耗时 …。之后每列占一行:

部分显示内容
名称和类型列名及其 DuckDB 类型
空值NULL 所占的比例,附一条小进度条;大于 0% 时高亮
不同值约 N 个不同值,是 DuckDB 估算的不同值个数
范围最小值 – 最大值;两者相等时只显示这一个值
中位数数值、日期和时间戳列才有
分布一张小图,见下文

分布图按列的类型而定:

  • 数值、日期和时间戳:画一张约 12 根等宽柱子的直方图。只有一个取值的列改为列出这个值。
  • 文本和布尔值:列出最常见的 5 个值,各自附上占总行数的比例;鼠标移到某个值上可以看到确切的行数。不同值超过约 10,000 个时,这些值是估算的,列在 高频值(估算) 下面,不显示比例。
  • List、struct、map 和 union:不画图。

工作方式:

  • 概览会把查询再完整运行一次,分两遍扫描:先用 SUMMARIZE 算统计值,再用一条 SELECT 算出每一列的分布。所以它覆盖完整的结果,而不只是表格在行数上限内保留的那些行;慢查询也会再慢一次。结果不确定的查询(random()、USING SAMPLE)描述的是第二次运行的结果。
  • 打开这个标签页时计算;标签页开着时,每来一个新结果就重新计算。
  • 只有能放进 FROM ( … ) 的查询才能概览,即以 SELECT、WITH、FROM、VALUES、TABLE、PIVOT 或 UNPIVOT 开头的查询(开头的 -- 注释会跳过)。其他语句,如 SHOW、DESCRIBE、PRAGMA、CALL、SUMMARIZE,会提示 只有 SELECT / WITH / FROM 这类查询的结果可以概览:概览会把查询再运行一次。

不写查询也能概览整张表、视图或已注册的文件:在侧栏右键它,选 列概览。这会把 FROM <名称>; 填进编辑器并运行,然后打开这个标签页。见右键菜单。

执行计划与性能分析的输出 ​

编辑器工具栏上的 执行计划 和 性能分析 按钮把输出显示在 结果 标签页里,当时开着别的标签页也会切回来。两者都会替换掉结果表格,要看回查询结果,重新运行一次即可。

执行计划 用等宽纯文本显示 DuckDB 的查询计划,上方一行是 EXPLAIN · 耗时 …。

性能分析 把实际执行的计划画成一棵树,每个算子一行,缩进在它所供数的算子下面:

  • 一条进度条,表示该算子耗时占全部算子耗时的比例;
  • 算子自身的耗时,不含子算子;
  • 算子名称,如 TABLE_SCAN、FILTER、HASH_GROUP_BY;
  • N 行:它产出的行数;
  • 预估 N:优化器对这一行数的估计(计划中有时才显示)。与实际相差超过 10 倍(无论偏大偏小)时高亮,鼠标移上去会提示 预估与实际相差超过 10 倍。估计偏差这么大,常常是连接(join)慢的原因;
  • 下面几行是算子处理的内容:过滤条件、连接键、投影列。

顶部一行是 性能分析 · 总耗时 … · 算子合计 …:前者是实际经过的时间,后者是各算子自身耗时之和。两者不相等,因为同一流水线上的算子是交错运行的;进度条的比例以后者为准。旁边的 最耗时:名称(耗时) 指出自身耗时最多的算子,这个算子所在的行用红色显示。

基于 Apache-2.0 许可开源发布。