Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres优化选择和索引_Postgresql_Select_Optimization_Indexing - Fatal编程技术网

Postgresql Postgres优化选择和索引

Postgresql Postgres优化选择和索引,postgresql,select,optimization,indexing,Postgresql,Select,Optimization,Indexing,我写了一个查询来总结金融交易,这样我就可以回到任何日期,找出当时的财务状况 数据是多公司的,因此该数据包含所有集团公司的信息 作为财务信息,一些账户在每年年底自行重置,而其他账户则有流动余额 各表的结构如下: 名义账户-每个账户返回1行 标称事务行-完整数据集 名义账户期年-是基于名义账户、月/年和财务公司的交易汇总 我的下面的SQL有效,但需要一分钟才能生成下面的SQL,它基于今天的日期 查询分为几个部分 案例na1.id=178的第一部分是一个特别账户,是该财政年度所有收入/支出记录的汇总

我写了一个查询来总结金融交易,这样我就可以回到任何日期,找出当时的财务状况

数据是多公司的,因此该数据包含所有集团公司的信息

作为财务信息,一些账户在每年年底自行重置,而其他账户则有流动余额

各表的结构如下:

名义账户-每个账户返回1行

标称事务行-完整数据集

名义账户期年-是基于名义账户、月/年和财务公司的交易汇总

我的下面的SQL有效,但需要一分钟才能生成下面的SQL,它基于今天的日期

查询分为几个部分

案例na1.id=178的第一部分是一个特别账户,是该财政年度所有收入/支出记录的汇总

第二部分首先查找汇总表中直到上个月末的所有记录,然后转到事务处理表以查找自本月初以来的所有记录。加在一起形成平衡

目前,交易表有大约2500万条记录,汇总表有26000条

我不是要求为我编写查询,只是一些关于如何加快查询速度的提示。因此,如果有人能提出优化它的方法,或者哪些索引有助于加速它,我将非常感激

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,然后在最后执行完全联接,查询时间从一分钟多到不到一秒钟。谢谢