以下是我们最常见问题的答案。
不能,添加大量 index 值并非没有缺点。权衡是跨许多 index 读取很慢。
实际上,由于 ABR 的工作方式,在一个查询中从许多 index 读取将导致低分辨率数据——可能低得无法使用。
另一方面,如果你选择与你的读取方式对齐的良好 index,查询将运行更快,你将获得更高分辨率的结果。
可以在 index 字段中连接多个值。因此,如果你想在 user ID 和 hostname 上建立 index,可以在 index 字段中写入,例如 "$userID:$hostname"。
请注意,根据你的查询模式,使用不同 index 写入相同数据集可能更有意义。常见误解是应避免「double-writing」数据。
得益于采样,多次写入数据的成本可能相对较低。但是,低效读取数据可能导致显著费用或由于采样导致低质量结果。
你可以使用 _sample_interval 字段——再次注意,这并不能告诉你结果是否准确。
当数据在读取时被采样,你可以识别,因为 sample interval 将是 10 的幂的倍数,例如 20 或 700。读取时何时开始采样没有硬性规则,但实践中读取更长时间段(或更多 index 值)将导致更高的 sample interval。
采样 largely 基于 index 的选择,以及其他因素,如查询的时间范围和读取的 index 数量。如果你从较大的 index 读取更长时间段,并 filter 到该 index 内相对较小的 subgroup,可能由于采样而不存在。
如果你需要读取该 subgroup 的准确结果,我们建议将该字段添加到 index(请参阅 What if I need to index on multiple values)。
采样数据高度可靠,特别是在使用精心选择的 index 时。
诚然,目前很难证明 ABR 查询返回的结果在特定 error bound 内。作为经验法则,使用 count() 检查读取的行数是个好主意——将其视为图像中的像素计数。读取的行数越多,结果越准确。(另一方面,_sample_interval 字段并不能告诉你结果是否准确)。如果你仅从一两行外推,结果不太可能具有代表性;如果你从数千行外推,结果很可能相当准确。
在不久的将来,我们计划在查询结果中暴露 margin of error ↗,以便你精确了解结果的准确程度。
Equitable sampling 既用于 normalize 组间差异,也用于处理给定 index 的大流量 spike。Equalization 每隔几秒发生;如果你非常接近地写入许多事件,则预期它们会在写入时被采样。给定 index 的 sample interval 会根据当前写入速率 moment to moment 变化。
没有固定规则决定何时触发采样。
我们观察到,对于像全球 CDN 这样在网络中分布负载的工作负载,每个 index 值每秒约需要 100 个数据点,采样才会变得 noticeable。
根据你的工作负载以及如何使用 Workers Analytics Engine,采样可能在此阈值更高或更低时开始。例如,如果你从单个 worker 执行写入许多数据点,数据更可能被采样。