Postgresql Postgres优化选择和索引
我写了一个查询来总结金融交易,这样我就可以回到任何日期,找出当时的财务状况 数据是多公司的,因此该数据包含所有集团公司的信息 作为财务信息,一些账户在每年年底自行重置,而其他账户则有流动余额 各表的结构如下: 名义账户-每个账户返回1行 标称事务行-完整数据集 名义账户期年-是基于名义账户、月/年和财务公司的交易汇总 我的下面的SQL有效,但需要一分钟才能生成下面的SQL,它基于今天的日期 查询分为几个部分 案例na1.id=178的第一部分是一个特别账户,是该财政年度所有收入/支出记录的汇总 第二部分首先查找汇总表中直到上个月末的所有记录,然后转到事务处理表以查找自本月初以来的所有记录。加在一起形成平衡 目前,交易表有大约2500万条记录,汇总表有26000条 我不是要求为我编写查询,只是一些关于如何加快查询速度的提示。因此,如果有人能提出优化它的方法,或者哪些索引有助于加速它,我将非常感激Postgresql Postgres优化选择和索引,postgresql,select,optimization,indexing,Postgresql,Select,Optimization,Indexing,我写了一个查询来总结金融交易,这样我就可以回到任何日期,找出当时的财务状况 数据是多公司的,因此该数据包含所有集团公司的信息 作为财务信息,一些账户在每年年底自行重置,而其他账户则有流动余额 各表的结构如下: 名义账户-每个账户返回1行 标称事务行-完整数据集 名义账户期年-是基于名义账户、月/年和财务公司的交易汇总 我的下面的SQL有效,但需要一分钟才能生成下面的SQL,它基于今天的日期 查询分为几个部分 案例na1.id=178的第一部分是一个特别账户,是该财政年度所有收入/支出记录的汇总
SELECT id, nominal_code AS nom_code, description AS descr, COALESCE(management_type,0) AS type,
case
when na1.id = 178
then (SELECT coalesce( (SELECT sum(period_movement)
FROM nominal_period_year JOIN nominal_account on nominal_account.id = nominal_period_year.nominal_account
WHERE (period_key/10000000000) <= 201704 AND
financial_company = 1 AND
nominal_account.profit_or_balance = true)
+
(SELECT sum(period_movement) FROM nominal_period_year WHERE nominal_account = na1.id AND
(period_key/10000000000) <= 201803 AND nominal_period_year.financial_company = 1)
+
(SELECT GREATEST(0, sum(db_Amount)) - GREATEST(0, sum(cr_Amount))
FROM nominal_transaction_lines
WHERE transaction_date between '2018-04-01' AND '2018-04-27'
AND original_id = 0
AND reversed_by = 0
AND status = 'A'
AND financial_company = 1 AND status = 'A' AND nominal_account = na1.id)
,0.00) AS balance)
ELSE
(SELECT coalesce(
(SELECT sum(period_movement) FROM nominal_period_year WHERE nominal_account = na1.id AND
(case
when na1.profit_or_balance = true
then (period_key/10000000000) > 201704
ELSE period_key > 0
end)
AND (period_key/10000000000) <= 201803 AND nominal_period_year.financial_company = 1)
+
(SELECT GREATEST(0, sum(db_Amount)) - GREATEST(0, sum(cr_Amount))
FROM nominal_transaction_lines
WHERE transaction_date between '2018-04-01' AND '2018-04-27'
AND original_id = 0
AND reversed_by = 0
AND financial_company = 1
AND status = 'A'
AND nominal_account = na1.id)
,0) AS balance)
end
FROM nominal_account AS na1
order by nom_code;
即使您没有显示EXPLAIN-ANALYZE,缓冲输出,所以我不得不猜测,您的问题是CASE表达式中的许多子选择。必须针对名义账户中的每一行执行这些指令。也许您可以在从或在CTE中的子选择中使用GROUP BY运行这些聚合。通过将SELECT拆分为3个单独的CTE,然后在最后执行完全联接,查询时间从一分钟多到不到一秒钟。谢谢