10 个你不知道的 PostgreSQL 功能
planner 的估计减少了100倍! 让我们试着理解为什么发生这种情况。 选择性= 0.001 * 0.01 = 0.00001。 当它乘以我们在表中的行数即 10000000 时,我们得到 100。这就是 planner 对 100 的估计值的来源。 但是,这些列不是独立的,那么我们如何告知 planner ? 在 PostgreSQL 中创建统计信息 在 Postgres 10 之前,没有一种简易的方式去告诉 planner 采集捕捉列之间关系的数据统计。但是, Postgres 10 有一个新特性正好解决了这个问题,可以使用 CREATE STATISTICS 来创建扩展统计的对象,告诉服务器去采集这些有意思的相关列的额外的统计信息。 函数依赖统计 回到我们先前评估的问题,col2 的值仅仅是 col1/10 。在数据库的术语中,我们会说 col2 是函数依赖于 col1 ,也就是说,col1 的值足以决定 col2 的值,并且不存在有两行数据拥有相同的 col1 值的同时有不同的 col2 值。因此,在 col2 列上的第二个过滤筛选并没有移除任何行!但是,planner 捕捉到了足够的统计信息去知道这件事情。 让我们来创建一个统计对象去捕获这些列和运行分析(ANALYZE)所依赖的函数统计。
让我们来看看现在的计划是怎么来的。
很好!让我们看一下对计划的测量。
看这里,我们可以看到, Postgres 意识到 col1 完全决定 col2 ,因此用系数1来捕获这些信息。现在,所有的查询都过滤这些列之后,计划将会得到更好的评估。 ndistinct 统计 函数依赖是你可以在列之间捕获的一种关系。 你可以捕获的另一种统计信息是一组列的不同值。 我们之前指出,planner 可以获取每列不同值的统计数字,但再次合并多列时,这些统计数据往往是错误的。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |