相关疑难解决方法(0)

为什么 array_agg() 比非聚合 ARRAY() 构造函数慢?

我刚刚查看了一些为8.4 之前的 PostgreSQL编写的旧代码,我看到了一些非常棒的东西。我记得以前有一个自定义函数可以做一些这样的事情,但我忘记了预先的array_agg()样子。回顾一下,现代聚合是这样写的。

SELECT array_agg(x ORDER BY x DESC) FROM foobar;
Run Code Online (Sandbox Code Playgroud)

然而,曾几何时,它是这样写的,

SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC);
Run Code Online (Sandbox Code Playgroud)

所以,我用一些测试数据试了一下..

CREATE TEMP TABLE foobar AS
SELECT * FROM generate_series(1,1e7)
  AS t(x);
Run Code Online (Sandbox Code Playgroud)

结果令人惊讶..#OldSchoolCool 方式要快得多:加速了 25%。此外,在没有ORDER 的情况下简化它,表现出同样的缓慢。

# EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar);
                                                         QUERY PLAN                                                          
-----------------------------------------------------------------------------------------------------------------------------
 Result  (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Seq Scan on foobar  (cost=0.00..104425.28 rows=6017728 width=32) (actual time=0.032..716.793 rows=10000000 loops=1) …
Run Code Online (Sandbox Code Playgroud)

postgresql benchmark aggregate array

16
推荐指数
2
解决办法
1万
查看次数

了解多表连接与聚合

我有一个关于如何JOIN在多个表上工作的基本问题。我想计算link1&中外键的出现次数link2

CREATE TABLE main (
   id SERIAL PRIMARY KEY,
   name text NOT NULL
);

CREATE TABLE link1 (
   id SERIAL PRIMARY KEY,
   main_id integer NOT NULL,
   CONSTRAINT main_id_fk FOREIGN KEY (main_id) REFERENCES main (id)
);

-- link2 is similar to link1
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。

SELECT main.id, COUNT(link1.main_id) + COUNT(link2.main_id)
FROM main
LEFT JOIN link1 ON main.id=link1.main_id
LEFT JOIN link2 ON main.id=link2.main_id
GROUP BY main.id
Run Code Online (Sandbox Code Playgroud)

postgresql join aggregate

5
推荐指数
2
解决办法
1万
查看次数

如何强制 PostgreSQL 中 WHERE 子句的顺序?

我在 Postgres 表中有 6 列:

A1 character varying(5)[]
A2 character varying(5)[]
A3 int REFERENCES ... -- FK 
B1 character varying(5)[]
B2 character varying(5)[]
B3 int REFERENCES ... -- FK 
Run Code Online (Sandbox Code Playgroud)

我需要一个SELECT匹配的第一行是获胜者(限制为 1)并匹配 A 组和 B 组。

我知道 Postgres 不关心WHERE子句的顺序,我必须准备一个ORDER子句或找到不同的方法。

我想准备匹配优先级的查找,我的WHERE子句重要性如下:

highest priority: (A1 and B1) OR
.                 (A1 and B2 OR A2 and B1) OR
.                 (A1 and B3 OR A3 and B1) OR
.                 (A2 and B3 OR A3 and B2) OR …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by

5
推荐指数
1
解决办法
1531
查看次数

标签 统计

postgresql ×3

aggregate ×2

array ×1

benchmark ×1

join ×1

order-by ×1