gpt4 book ai didi

postgresql - 基于选定列的查询简化

转载 作者:行者123 更新时间:2023-11-29 13:24:04 25 4
gpt4 key购买 nike

我试图了解 PostgreSQL 如何简化查询:假设我有 2 个表(“tb_thing”和“tb_thing_template”),其中每个表都指向一个模板,并且我运行这样的查询:

EXPLAIN SELECT
tb_thing.id
FROM
tb_thing,
tb_thing_template
WHERE
tb_thing_template.id = tb_thing.template_id
;

这是结果:

                                   QUERY PLAN                                    
---------------------------------------------------------------------------------
Hash Join (cost=34.75..64.47 rows=788 width=4)
Hash Cond: (tb_thing.template_id = tb_thing_template.id)
-> Seq Scan on tb_thing (cost=0.00..18.88 rows=788 width=8)
-> Hash (cost=21.00..21.00 rows=1100 width=4)
-> Seq Scan on tb_thing_template (cost=0.00..21.00 rows=1100 width=4)

即使我只是从“tb_thing”中选择一个字段而没有从“tb_thing_template”中选择任何字段,计划程序也会加入这两个表。我希望规划器足够聪明,可以弄清楚它实际上不需要加入“tb_thing_template”表,因为我没有从中选择任何东西。

为什么它仍然进行连接?为什么在计划查询时不考虑列选择?

谢谢!

最佳答案

从语义上讲,您的查询和一个简单的 SELECT tb_thing.id FROM tb_thing 是不一样的。

例如,假设表 tb_thing_template 有 4 行具有相同的 id 值,该值也是 tb_thing.template_id。您的查询结果将有 4 行具有相同的 tb_thing.id。相反,如果 tb_thing.template_id 不存在于 tb_thing_template.id 中,则不会输出该行。

仅当 tb_thing_template.id 是一个 PRIMARY KEY(如此唯一)并且 tb_thing.template_id 是一个 FOREIGN KEY 到那个 id,每个 PRIMARY KEY 只有一行,所以 1:1 的关系,这两个查询在语义上是相同的。即使是在 PK-FK 关系中更典型的 1:N 关系,也需要语义意义上的连接。但是规划器无法知道关系是否是 1:1,所以你得到了连接。

但是你不应该试图欺骗查询规划器;它很聪明,但不一定比你(可能)笨。

关于postgresql - 基于选定列的查询简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com