Postgres оптимизирует SELECT и индексы - PullRequest
0 голосов
/ 27 апреля 2018

Я написал запрос для обобщения финансовых транзакций, чтобы я мог вернуться к любой дате и выяснить, каково было финансовое положение в то время.

Данные относятся к нескольким компаниям, поэтому данные содержат информацию для всех компаний группы

Будучи финансовой информацией, некоторые счета обнуляются в конце каждого года, в то время как другие имеют текущий баланс.

Структура таблиц:

nominal_account - возвращает 1 строку для каждой учетной записи

nominal -action_lines - полный набор данных

nominal_period_year - сводка транзакций, основанная на номинальном счете, месяце / году и финансовой компании.

Мой SQL ниже работает, но генерируется более минуты (ниже SQL основан на сегодняшней дате).

Запрос разбит на несколько разделов.

Первая часть дела (na1.id = 178) представляет собой специальный счет, который представляет собой сводку всех записей о доходах / расходах за этот финансовый год.

Вторая часть сначала ищет все записи в сводной таблице до конца последнего месяца, а затем переходит к таблице транзакций, чтобы найти какие-либо записи с начала текущего месяца. Сложенные вместе, что составляет баланс.

В настоящее время таблица транзакций содержит около 25 млн записей и сводную таблицу 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...