按基数从低到高排序
时间粒度至关重要
ORDER BY 子句中使用时间戳时,需要权衡基数与精度。微秒级精度的时间戳会带来非常高的基数 (几乎每一行对应一个唯一值) ,从而降低 ClickHouse 稀疏主索引的效果。经过舍入的时间戳基数较低,更有利于索引跳过,但会损失基于时间的查询精度。
runnable editable
关注单个查询,而不是平均值
内存与行扫描
GROUP BY user_id, error_message, url_path 这样的查询,会为这三个值的每一种唯一组合创建一个独立的内存状态。随着用户数、错误类型和 URL 路径增多,你很容易生成数百万个聚合状态,而这些状态都必须同时保存在内存中。
对于极端情况,Sentry 会使用确定性采样。10% 的样本可将内存使用量降低 90%,同时对大多数聚合操作仍能保持约 5% 的精度:
cityHash64() 对相同输入始终会生成相同的哈希值,因此 user_id = 12345 总会被哈希为同一个值,保证该用户要么始终出现在你的 10% 样本中,要么始终不会出现——不会在不同查询之间来回“跳变”。
Sentry 的位掩码优化
视频资源
- 迷失在 haystack 中:优化高基数聚合 - Sentry 在 production 环境中的内存优化经验
- ClickHouse 性能分析 - Alexey Milovidov 谈调试方法论
- ClickHouse Meetup:查询优化技巧 - 社区优化策略