我正在使用 Postgres 9.4,以及最近分析过的数据库。这些是我的表:
Materialized view "public.vw_chemical_summary_by_ccg"
Column | Type | Modifiers
-----------------+----------------------+-----------
processing_date | date |
pct_id | character varying(3) |
chemical_id | character varying(9) |
items | bigint |
cost | double precision |
Indexes:
"vw_idx_chem_by_ccg_chem_id" btree (chemical_id)
"vw_idx_chem_by_ccg_chem_id_vc" btree (chemical_id varchar_pattern_ops)
"vw_idx_chem_by_ccg_joint_id" btree (pct_id, chemical_id)
Table "public.frontend_pct"
Column | Type | Modifiers
-------------------+-------------------------+-----------
code | character varying(3) | not null
name | character varying(200) |
org_type | character varying(9) | not null
Indexes:
"frontend_pct_pkey" PRIMARY KEY, btree (code)
"frontend_pct_code_1df55e2c36c298b2_like" btree (code varchar_pattern_ops)
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
EXPAIN (ANALYSE, BUFFERS)
SELECT pr.pct_id AS row_id, pc.name AS row_name,
pr.processing_date AS date, SUM(pr.cost) AS actual_cost,
SUM(pr.items) AS items
FROM vw_chemical_summary_by_ccg pr
JOIN frontend_pct pc
ON pr.pct_id=pc.code AND pc.org_type='CCG'
GROUP BY row_id, row_name, date
ORDER BY date, row_id;
Run Code Online (Sandbox Code Playgroud)
分析结果显示,在运行 GroupAggregate 之前,对 500 万行的排序非常缓慢。
GroupAggregate 的结果只有 5,000 行。那么先聚合再排序不是更有意义吗?
在这里解释:http : //explain.depesz.com/s/IS1
任何其他加快查询速度的建议也将非常受欢迎。
除非查询引擎知道只会有一些结果,因此GROUP BY它可以在数据流通过时将值和相关聚合归档到固定大小数量的容器中,否则在没有数据预定义的情况下进行分组是不切实际的。已排序。因此,您看到的排序操作特定于您指定的组操作。如果您可以(重新)安排查询(可能还有可用的索引),使数据进入按适当列自然排序的分组状态,那么您可以避免这个额外的步骤。