假设我有一个包含列customer_id
(随机生成的字符串)和的仅附加表x
,并且查找总是在customer_id
.
假设数据如下所示,就好像我们在客户最初注册某项时获得了一批行,然后再也没有为该客户注册。
customer_id=XCVFY0001, x=...
customer_id=XCVFY0001, x=...
(continues for ~1 page with same customer_id)
customer_id=HUMBN0001, x=...
customer_id=HUMBN0001, x=...
(continues for ~1 page with same customer_id)
(and so on...)
因此,虽然customer_id
的字母顺序与物理行无关,但我们可以做出如下陈述:
- 每页很少有不同的客户 ID
- 每个 ID 有几页
- 有很长的“运行”ID,或者,如果您需要一个
customer_id
,您可能会在几个连续的页面上找到它 - 就信息论而言,我认为他们会说没有相关性,但存在很高的“互信息”
如果没有明确运行,查询规划器可以在估计中使用这样的信息CLUSTER
吗?我假设如果correlation
报告中的低pg_stats
,它会猜测行在整个页面中均匀分布,并且可能对各种计划持悲观态度。
(在我的现实世界模拟中,一个普通的非聚集索引无论如何都能让事情变得又好又快,但是当我注意到数据中的模式时我只是好奇。)
规划者不知道这种类型的聚类,因此无法根据它做出决策。
ANALYZE 使用的两步采样方法在这种情况下会产生倾斜的样本,可能导致对 n_distinct 的严重低估。如果不深入研究单个查询的细节,就很难预测这可能会产生什么后果。