【发布时间】:2021-07-22 15:20:46
【问题描述】:
您好,当前的查询执行时间过长,应进行哪些更改以减少执行时间?
EXPLAIN ANALYZE
SELECT date_trunc({{period}}, wb.timestamp),
CAST(COUNT(DISTINCT(org.id)) AS float) / CAST(COUNT(DISTINCT(wb.anonymous_id)) AS float) AS "marketing-lead conversion rate"
FROM website_prod.pages wb
FULL JOIN core_prod.organizations_organization org ON CAST(wb.timestamp AS DATE) = CAST(org.created_at AS DATE)
WHERE NOT org.is_internal
AND wb.timestamp > date_trunc('month', CURRENT_DATE) - INTERVAL '1 year'
AND org.created_at > date_trunc('month', CURRENT_DATE) - INTERVAL '1 year'
GROUP BY 1
QUERY PLAN
Sort Key: ((org.created_at)::date)
Sort Method: quicksort Memory: 608kB
-> Seq Scan on organizations_organization org (cost=0.00..259.02 rows=5080 width=19) (actual time=0.017..6.266 rows=5316 loops=1)
Filter: ((NOT is_internal) AND (created_at > (date_trunc('month'::text, (('now'::cstring)::date)::timestamp with time zone) - '1 year'::interval)))
Rows Removed by Filter: 1540
-> Materialize (cost=69882.44..71012.63 rows=226038 width=45) (actual time=541.950..849.952 rows=3917712 loops=1)
-> Sort (cost=69882.44..70447.54 rows=226038 width=45) (actual time=541.945..592.666 rows=232720 loops=1)
Sort Key: ((wb."timestamp")::date)
Sort Method: external merge Disk: 14104kB
-> Seq Scan on pages wb (cost=0.00..42826.15 rows=226038 width=45) (actual time=40.801..358.687 rows=232720 loops=1)
Filter: ("timestamp" > (date_trunc('month'::text, (('now'::cstring)::date)::timestamp with time zone) - '1 year'::interval))
Rows Removed by Filter: 72766
Planning time: 0.214 ms
Execution time: 26614.737 ms
【问题讨论】:
-
除了格式错误之外,这似乎不是一个完整的执行计划,只是一堆顺序扫描和排序。请提供完整的平面图并保留前导空格。
-
您知道使用
FULL JOIN(OUTER加入),与您当前的WHERE子句一起简单地将其转回INNER JOIN? -
我建议你问一个新的问题。提供示例数据、期望的结果以及代码应该做什么的清晰解释。
标签: sql postgresql performance