gpt4 book ai didi

sql - 需要帮助理解 JOIN 查询与带有子选择的查询的 SQL 解释

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

我在这里发布了一个先前的问题,询问什么是更好的JOIN 查询或使用子选择的查询。链接:Queries within queries: Is there a better way?

这是对该问题的扩展。有人可以向我解释为什么我在这里看到的是什么吗?

查询(子选择):

SELECT article_seq, title, synopsis, body, lastmodified_date, (SELECT type_id FROM types WHERE kbarticles.type = type_seq), status, scope, images, archived, author, owner, (SELECT owner_description FROM owners WHERE kbarticles.owner = owner_seq),  (SELECT review_date FROM kbreview WHERE kbarticles.article_seq = article_seq) FROM kbarticles WHERE article_seq = $1

解释分析(子选择)

QUERY PLAN

Index Scan using article_seq_pkey on kbarticles (cost=0.00..32.24 rows=1 width=1241) (actual time=1.421..1.426 rows=1 loops=1)

Index Cond: (article_seq = 1511)

SubPlan

-> Seq Scan on kbreview (cost=0.00..14.54 rows=1 width=8) (actual time=0.243..1.158 rows=1 loops=1)

Filter: ($2 = article_seq)

-> Seq Scan on owners (cost=0.00..1.16 rows=1 width=24) (actual time=0.073..0.078 rows=1 loops=1)

Filter: ($1 = owner_seq)

-> Index Scan using types_type_seq_key on types (cost=0.00..8.27 rows=1 width=24) (actual time=0.044..0.050 rows=1 loops=1)

Index Cond: ($0 = type_seq)

Total runtime: 2.051 ms

查询(JOIN)

SELECT k.article_seq, k.title, k.synopsis, k.body, k.lastmodified_date, t.type_id, k.status, k.scope, k.images, k.archived, k.author, k.owner, o.owner_description, r.review_date FROM kbarticles k JOIN types t ON k.type = t.type_seq JOIN owners o ON k.owner = o.owner_seq JOIN kbreview r ON k.article_seq = r.article_seq WHERE k.article_seq = $1

解释分析(JOIN)

QUERY PLAN

Nested Loop (cost=0.00..32.39 rows=1 width=1293) (actual time=0.532..1.467 rows=1 loops=1)

Join Filter: (k.owner = o.owner_seq)

-> Nested Loop (cost=0.00..31.10 rows=1 width=1269) (actual time=0.419..1.345 rows=1 loops=1)

-> Nested Loop (cost=0.00..22.82 rows=1 width=1249) (actual time=0.361..1.277 rows=1 loops=1)

-> Index Scan using article_seq_pkey on kbarticles k (cost=0.00..8.27 rows=1 width=1241) (actual time=0.065..0.071 rows=1 loops=1)

Index Cond: (article_seq = 1511)

-> Seq Scan on kbreview r (cost=0.00..14.54 rows=1 width=12) (actual time=0.267..1.175 rows=1 loops=1)

Filter: (r.article_seq = 1511)

-> Index Scan using types_type_seq_key on types t (cost=0.00..8.27 rows=1 width=28) (actual time=0.048..0.055 rows=1 loops=1)

Index Cond: (t.type_seq = k.type)

-> Seq Scan on owners o (cost=0.00..1.13 rows=13 width=28) (actual time=0.022..0.038 rows=13 loops=1)

Total runtime: 2.256 ms

根据我在上一个问题中给出(和接受)的答案,JOIN 应该证明有更好的结果。但是,在我所有的测试中,我发现 JOIN 的结果差了几毫秒。 JOIN 似乎也充满了嵌套循环。我正在JOIN的所有表都已编入索引。

我是否在做一些我应该做的不同的事情?有什么我想念的吗?

最佳答案

这些查询在逻辑上是不同的。

第一个:

SELECT  article_seq, title, synopsis, body, lastmodified_date,
(
SELECT type_id
FROM types
WHERE kbarticles.type = type_seq
),
status, scope, images, archived, author, owner,
(
SELECT owner_description
FROM owners
WHERE kbarticles.owner = owner_seq
),
(
SELECT review_date
FROM kbreview
WHERE kbarticles.article_seq = article_seq
)
FROM kbarticles
WHERE article_seq = $1

第二个:

SELECT  k.article_seq, k.title, k.synopsis, k.body, k.lastmodified_date, t.type_id, k.status,
k.scope, k.images, k.archived, k.author, k.owner, o.owner_description, r.review_date
FROM kbarticles k
JOIN types t
ON k.type = t.type_seq
JOIN owners o
ON k.owner = o.owner_seq
JOIN kbreview r
ON k.article_seq = r.article_seq
WHERE k.article_seq = $1

如果 typesownerskbreview 中有多个记录,第一个查询将失败,而第二个将返回重复项来自 kbarticles

如果kbarticle 没有typesownerskbreviews,第一个查询将返回一个NULL 在适当的字段中,而第二个将忽略该记录。

如果*_seq 字段看起来是PRIMARY KEY 字段,则永远不会重复,查询永远不会失败;同样,如果 kbarticlesFOREIGN KEY 引用限制为 typesownerskbreview,不能有缺失的行。

但是,JOIN 运算符为优化器提供了更多空间:它可以使任何表领先并使用更高级的 JOIN 技术,如 HASH JOINMERGE JOIN 如果您使用子查询则不可用。

关于sql - 需要帮助理解 JOIN 查询与带有子选择的查询的 SQL 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692650/

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