☰
SonnetDB:使用 histogram() 进行等宽分桶分布分析
2026/10/14 8:58:26 网站建设 项目流程

直方图可以帮助观察响应时间、温度或电压集中在哪些区间。SonnetDB 的histogram(field, bin_width)在 SQL 聚合中计算等宽区间计数。旧稿把第二个参数写成“桶数量”,并把返回值描述为嵌套表,这两点都需要纠正。

本文按 2026-10-13 当前工作区文档与源码复核;部署版本须单独核对。以下 SQL 是复现示例,本轮未执行 SQL、模型或性能验收。

第二个参数是桶宽

histogram(response_time_ms, 50)表示每个区间宽 50 毫秒,不是产生 50 个桶。当前实现要求桶宽为正的有限数,并按floor(value / bin_width)找桶,所以边界相对于零对齐;负数也按向下取整归入相应区间。

例如 35、85、120 三个值,在宽度 50 下分别落入[0,50)、[50,100)、[100,150)。这只是便于理解的手工分桶示例,不是本次数据库运行回执。

写入响应时间并查看分布

CREATEMEASUREMENT api_requests(service TAG,response_time_ms FIELDFLOAT);INSERTINTOapi_requests(time,service,response_time_ms)VALUES(1713676800000,'orders',35),(1713676810000,'orders',85),(1713676820000,'orders',120);SELECThistogram(response_time_ms,50)ASdistributionFROMapi_requestsWHEREservice='orders'ANDtime>=1713676800000ANDtime<1713763200000;

已有 schema 时不重复 CREATE。当前数值聚合接受 Float64、Int64 和 Boolean 的既有数值转换,不接受字符串、向量或地理字段。

返回值是 JSON 字符串

实现生成一个 JSON 对象字符串,键是左闭右开的区间文字,值是该区间计数。例如:

{"[0,50)":1,"[50,100)":1,"[100,150)":1}

只输出实际有值的桶,并按桶序排列。没有有效输入时返回 NULL;NaN 和 Infinity 不参与分桶。它不是可直接LATERAL UNNEST的表,也没有旧稿假定的bucket_start/bucket_end/count列。需要画图或计算百分比时,在应用中解析字符串、求计数之和,并处理 NULL 或空数据。

与时间桶组合

SELECTtime,histogram(response_time_ms,50)ASdistributionFROMapi_requestsWHEREservice='orders'ANDtime>=1713676800000ANDtime<1713763200000GROUPBYtime(1h);

这样可以分别观察每小时的分布。更窄的桶宽提供更细的区间,但也可能增加实际桶数量与状态开销;当前字典保存出现过的桶,不能宣称固定数量、固定内存或任意规模的查询性能。

直方图适合观察分布,精确阈值告警、分位数和直方图各自回答不同的问题。选桶宽时先依据业务单位,再用真实分布核对有效性。

依据:SQL 参考、HistogramFunction/Accumulator。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询