gpt4 book ai didi

postgresql - 选择不同的 generate_series postgresql

转载 作者:行者123 更新时间:2023-11-29 14:21:52 25 4
gpt4 key购买 nike

我知道 distinct 和 generate series 的意思。但是当我执行这个查询时,问号在我脑海中飞舞。

select distinct generate_series(0,8)

结果很奇怪。

enter image description here

有人可以帮我解释一下发生了什么吗?

最佳答案

没有 ORDER BY 子句的 SELECT 查询没有定义的顺序,它只会以任何顺序返回相关行便于执行DBMS。

在“真实”表的情况下,这可能是按照 PRIMARY KEY 的顺序,按照它们被插入表中的顺序,或者按照执行计划中使用的特定索引的顺序。

在此示例中,generated_series() 创建的“表”显然以 0、1、2、3 等顺序开始。但是,顺序要检查您对查询施加的 DISTINCT 约束,Postgres 必须做一些事情来检查项目是否出现不止一次。 (它无法知道 generate_series() 函数将始终提供不同的值。)

(通常)执行此操作的一种有效方法是构建要检查其唯一性的值的“ HashMap ”。您无需根据每个现有值检查每个新值,而是计算它会落入哪个“哈希桶”;如果桶是空的,则该值是唯一的;如果不是,您只需将其与该存储桶中的其他值进行比较。

运行 EXPLAIN select distinct generate_series(0,8) 将显示 Postgres 选择的查询计划;对我来说(大概对你来说)这看起来像这样:

HashAggregate  (cost=0.02..0.03 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)

正如预期的那样,那里有一个 HashAggregate 操作,运行 generate_series() 的结果以检查它的唯一性。 (我不知道这个操作究竟是如何工作的,也不重要,但这个名字强烈暗示它正在使用 HashMap 来完成工作)。

在散列操作结束时,Postgres 可以简单地从散列映射中读出值,而不是返回到原始列表,所以它这样做了。结果,它们不再是原来的顺序,而是按照它们落入的“哈希桶”排序。

这个故事的寓意是:始终使用 ORDER BY 子句!

关于postgresql - 选择不同的 generate_series postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308626/

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