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