Timescale Cloud:性能、规模、企业级

自托管产品

MST

Timescale 使用近似算法来计算百分位,而无需所有数据。这使得它们与连续聚合更兼容。默认情况下,Timescale 使用 uddsketch,但您也可以选择使用 tdigest。本节描述了不同的方法,并帮助您决定应该使用哪种方法。

uddsketch 是默认算法。它使用指数大小的桶来保证近似值落在已知误差范围内,相对于真实的离散百分位。该算法能够调整草图的大小和最大误差目标。

tdigest 更积极地将数据分桶到分位数范围的中心,从而在范围的尾部(大约 0.001 或 0.995)提供更高的准确性。

每种算法都有不同的特点,这使得根据您的用例,一种算法可能比另一种更好。以下是在选择算法时需要考虑的一些差异:

在开始之前,重要的是要了解百分位的正式定义是不精确的,并且有不同的方法来确定真正的百分位到底是什么。在 PostgreSQL 中,给定目标百分位 ppercentile_disc 返回集合中最小的元素,使得集合中 p 百分比的元素小于该元素。然而,percentile_cont 返回 p 的两个最近匹配项之间的插值。实际上,这些方法之间的差异非常小,但如果对您的用例很重要,请记住 tdigest 近似连续百分位,而 uddsketch 提供离散值的估计。

考虑您最感兴趣的百分位类型。tdigest 针对极值处的更准确估计进行了优化,而中位数附近的估计准确性较低。如果您的工作流程涉及估计九十九百分位,那么选择 tdigest。如果您更关注获得高精度的中位数估计,请选择 uddsketch

这些算法在估计数据的方式上有所不同。uddsketch 具有稳定的分桶函数,因此无论数据如何排序或重新聚合,它始终为相同的基础数据返回相同的百分位估计值。另一方面,tdigest 根据附近点的平均值构建增量桶,这可能导致基于相同数据的估计值出现一些细微差异,除非严格控制聚合的顺序和批处理,这在 PostgreSQL 中有时很难做到。如果稳定的估计对您很重要,请选择 uddsketch

精确计算 tdigest 的误差范围可能很困难,尤其是在将多个子摘要合并为更大的摘要时。这可以通过摘要聚合或常规点聚合的并行化发生。如果您需要严格表征误差,请选择 uddsketch。然而,由于 uddsketch 使用指数分桶来提供有保证的相对误差,如果数据集覆盖的范围很大,它可能会导致一些剧烈变化的绝对误差。例如,如果数据均匀分布在 [1,100] 范围内,则百分位范围高端的估计值比范围低端的估计值具有大约 100 倍的绝对误差。如果数据范围是 [0,100],则情况会更加极端。如果稳定的绝对误差对您的用例很重要,请选择 tdigest

虽然这两种算法在未来的优化中都可能变得更小、更快,但 uddsketch 通常比 tdigest 需要更小的内存占用,并且对于任何连续聚合,相应地需要更小的磁盘占用。无论您选择哪种算法,提高百分位估计准确性的最佳方法是增加桶的数量,这在使用 uddsketch 时更简单。如果您的用例没有从使用 tdigest 中获得明显的好处,那么默认的 uddsketch 是您的最佳选择。

有关不同算法的更多技术细节和使用示例,请参阅 uddsketchtdigest 的开发人员文档。

关键词

在此页面上发现问题?报告问题 或在 GitHub 上编辑此页面