- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个表 calls
和 calls_statistics
。 calls
有一个主键calls_id
,它是calls_statistics
中的一个外键。
调用当前包含 16k 个条目。
当我运行时
SELECT c.*,
array_agg(cs.mean) AS statistics_means
FROM calls AS c
LEFT JOIN calls_statistics AS cs ON c.calls_id = cs.calls_id
GROUP BY c.calls_id
order by caller_id ASC, call_time ASC LIMIT 100;
查询耗时约622毫秒
Limit (cost=11947.99..11948.24 rows=100 width=551) (actual time=518.921..518.941 rows=100 loops=1)
-> Sort (cost=11947.99..11989.07 rows=16429 width=551) (actual time=518.918..518.928 rows=100 loops=1)
Sort Key: c.caller_id, c.call_time
Sort Method: top-N heapsort Memory: 126kB
-> HashAggregate (cost=11114.73..11320.09 rows=16429 width=551) (actual time=461.869..494.761 rows=16429 loops=1)
-> Hash Right Join (cost=6234.65..10705.12 rows=81922 width=551) (actual time=79.171..257.498 rows=81922 loops=1)
Hash Cond: (cs.calls_id = c.calls_id)
-> Seq Scan on calls_statistics cs (cost=0.00..2627.22 rows=81922 width=12) (actual time=3.534..26.778 rows=81922 loops=1)
-> Hash (cost=6029.29..6029.29 rows=16429 width=547) (actual time=75.578..75.578 rows=16429 loops=1)
Buckets: 2048 Batches: 1 Memory Usage: 9370kB
-> Seq Scan on calls c (cost=0.00..6029.29 rows=16429 width=547) (actual time=13.806..42.446 rows=16429 loops=1)
Total runtime: 622.537 ms
但是,当我禁用 array_agg
并运行查询时,它会使用我的索引:
SELECT c.*,
cs.mean
FROM calls AS c
LEFT JOIN calls_statistics AS cs ON c.calls_id = cs.calls_id
order by caller_id ASC, call_time ASC LIMIT 100;
查询仅需 0.565 毫秒!
Limit (cost=0.70..52.93 rows=100 width=551) (actual time=0.077..0.320 rows=100 loops=1)
-> Nested Loop Left Join (cost=0.70..42784.95 rows=81922 width=551) (actual time=0.075..0.304 rows=100 loops=1)
-> Index Scan using calls_caller_id_call_time_calls_id_idx on calls c (cost=0.29..22395.06 rows=16429 width=547) (actual time=0.042..0.091 rows=25 loops=1)
-> Index Scan using calls_stats_calls_idx on calls_statistics cs (cost=0.42..1.18 rows=6 width=12) (actual time=0.003..0.005 rows=4 loops=25)
Index Cond: (c.calls_id = calls_id)
Total runtime: 0.565 ms
不会只是聚合成数组就花那么多时间吧?我做错了什么?
我正在使用 Postgres 9.3。
最佳答案
一个选项是从表 calls
中选择 100 行,然后加入并聚合 calls_statistics
。
类似于:
WITH top_calls as (SELECT c.*
FROM calls AS c
ORDER BY caller_id ASC, call_time ASC
LIMIT 100)
SELECT c.*,
array_agg(cs.mean) AS statistics_means
FROM top_calls AS c
LEFT JOIN calls_statistics AS cs ON c.calls_id = cs.calls_id
GROUP BY c.calls_id
order by caller_id ASC, call_time ASC;
它将为您提供与第一个查询完全相同的输出。
关于sql - PostgreSQL array_agg 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889518/
t1 id|entity_type 9|3 9|4 9|5 2|3 2|5 t2 id|entity_type 1|3 1|4 1|5 SELECT t1.id, array_agg(t1.
我有一个 SQL 表 message(application, type, action, date, ...) 我想获取一个类型的所有操作和一个应用程序的所有类型如果可能,单个查询。 到目前为止,我
我有以下查询: SELECT DISTINCT ON (ps.p) m.groundtruth, ps.p, ARRAY_AGG(m.anchor_id), ARRAY_AGG(m.id) FRO
我想使用 array_agg在子查询中,然后在我的主查询中通过它的数组索引使用聚合数据,但是,在尝试了许多不同的方法之后,我真的不知道应该怎么做;有人可以解释为什么在下面的示例中我得到了一系列 Non
我正在尝试连接一个表,该表可能具有多个给定 ID 的条目,并将与该 ID 对应的行聚合到一个数组中。这在 SQL 查询中看起来如下: SELECT * from data LEFT JOIN (sel
我有一张表格,其中列出了潜在客户、他们的事件和他们的销售代表。每个客户最多可以有 1 名销售代表。我建立了一个汇总表,在其中汇总客户事件,并按销售代表对其进行分组,并按客户创建日期进行筛选。这不是一个
我在带有 Java-8 的 Ubuntu 10.6-1.pgdg18.04+1 上使用 PostgreSQL 10.6。我有两个表: 表格测试 Column | Type
是否有任何替代 PostgreSQL array_agg() 函数的方法,以便它不会以以下格式返回值:'{x,y,z,}' . 我可以让它只返回:'x,y,z' 吗? 最佳答案 在 PostgreSQ
我目前有一个这样的示例标记表: id | tag | user_id | video_id 1 | cake | 1 | 1 2 | cookie |
作为测试,我创建了这个模式: CREATE TABLE simple_table (client_id int4, order_id int4); INSERT INTO simple_table (
我正在尝试创建一个返回字符串数组的函数,我可以在没有函数的情况下执行此操作并返回 record[] 类型,当我尝试返回该类型时导致它表示不支持的功能。 CREATE OR REPLACE FUNCTI
我有以下 Postgres 查询: SELECT array_agg("Esns".id ) FROM public."Esns", public."PurchaseOrderItems"
我正在尝试让 array_agg 与 Postgresql 中的数组类型一起工作,但我无法弄清楚这是否可行,如果可行,该怎么做。我查询的相关部分如下所示: array_agg(ARRAY[e.aler
表“动物”: animal_name animal_type Tom Cat Jerry Mouse Kermit Frog 查询: SELECT array_t
我正在尝试创建一个具有不同结构的数组作为列的值,类似这样 select array_agg(distinct struct(field_a, field_b)) as c FROM tables ..
我在 postgres 中有一对多的关系(事件有很多 EventUser),并且想扫描并存储到结构 Event . // EventUser struct type EventUser struct
我想为我的表中的每个用户选择不同的列值(在 Google BigQuery 中)。我想过使用 ARRAY_AGG()喜欢: SELECT user_id, ARRAY_AGG(DISTINCT fie
如何计算由 ARRAY_AGG() 在 PostgresQL 中创建的数组对象中不同元素的数量?这是一个用于讨论目的的玩具示例: SELECT ARRAY_AGG (first_name || ' '
考虑这个例子: SELECT comment_date , array_agg(user_id) users , array_agg(comment) comme
我有一个表 calls 和 calls_statistics。 calls 有一个主键calls_id,它是calls_statistics 中的一个外键。 调用当前包含 16k 个条目。 当我运行时
我是一名优秀的程序员,十分优秀!