Postgres 的 TABLESAMPLE 其实是在挑地址

Tablesample Picks Rows

Postgres 的 TABLESAMPLE 其实是在挑地址

面对 TB 级大表,全表扫描往往代价高昂。Postgres 的 TABLESAMPLE 功能看似在随机抽取行,实则是在随机抽取数据页地址。SYSTEM 模式按页抽样,虽然速度极快,但若数据按时间或 ID 有序排列,会导致样本严重偏差,无法准确反映最小值或平均值。相比之下,BERNOULLI 模式逐行抽样更精准但性能较差。文章深入剖析了底层机制,指出若需可复现且稳定的抽样,应放弃基于地址的随机,转而使用主键哈希(hashint8extended)来锁定特定行,从而避免因数据更新或 VACUUM 导致的样本漂移。

TABLESAMPLE 所有怪异行为的根源在于一个事实:它选取的不是行,而是地址。

同日更多故事

2026-10-25