GBase 8c
其他
文章

GBase 8c 函数依赖统计

发表于2023-12-07 11:31:3812次浏览4个评论

回到先前评估的问题,col2 的值仅仅是 col1/10 。在数据库的术语中,我们会说 col2 是函数依赖于 col1 ,也就是说,col1 的值足以决定 col2 的值,并且不存在有两行数据拥有相同的 col1 值的同时有不同的 col2 值。因此,在 col2 列上的第二个过滤筛选并没有移除任何行!但是,planner 捕捉到了足够的统计信息去知道这件事情。

让我们来创建一个统计对象去捕获这些列和运行分析(ANALYZE)所依赖的函数统计。

CREATE STATISTICS s1 (dependencies) on col1, col2 from tbl;

ANALYZE tbl;
让我们来看看现在的计划是怎么来的。

EXPLAIN ANALYZE SELECT * FROM tbl where col1 = 1 and col2 = 0;

QUERY PLAN

-----------------------------------------------------------------------------------------------------------

Seq Scan on tbl (cost=0.00..194247.76 rows=9584 width=8) (actual time=0.638..629.741 rows=10000 loops=1)

Filter: ((col1 = 1) AND (col2 = 0))

Rows Removed by Filter: 9990000

Planning time: 0.115 ms

Execution time: 630.076 ms

(5 rows)
让我们看一下对计划的测量。

SELECT stxname, stxkeys, stxdependencies

FROM pg_statistic_ext

WHERE stxname = 's1';

stxname | stxkeys | stxdependencies

---------+---------+----------------------

s1 | 1 2 | {"1 => 2": 1.000000}

(1 row)
看这里,我们可以看到, Postgres 意识到 col1 完全决定 col2 ,因此用系数1来捕获这些信息。现在,所有的查询都过滤这些列之后,计划将会得到更好的评估。

评论

登录后才可以发表评论
用户头像
levvel发表于 8个月前
来报个到
崔哥发表于 7个月前
常羡人间琢玉郎,天应乞与点酥娘。尽道清歌传皓齿,风起,雪飞炎海变清凉。万里归来颜愈少,微笑,笑时犹带岭梅香。试问岭南应不好,却道:此心安处是吾乡。
用户头像
levvel发表于 6个月前
给你点个赞
用户头像
levvel发表于 5个月前
必须点赞!