Преглед: v_company_billing_overview
| Датотека | views/08_company_billing_view.sql
|
|---|
| Шема | kbnteam
|
|---|
| Категорија | Договори, Фактурирање и Верност
|
|---|
| Поврзани индекси | indexes/v_company_billing_overview_index.sql
|
|---|
Опис
Прикажува вкупни износи на фактури, бројот на нарачки на купувачи и бројот на договори по компанија. Користи два CTE: company_contracts го брои бројот на договори по компанија, а invoice_totals ги агрегира вкупните износи по фактура. Важен преглед за финансиски извештај и прикажување на фактури во администраторски панел.
Зависности
| Табела | Тип на употреба
|
|---|
kbnteam.invoice | Главна табела
|
kbnteam.company_order | JOIN — компаниска нарачка
|
kbnteam.customer_order | LEFT JOIN — нарачки (за вкупен износ)
|
kbnteam.contract | LEFT JOIN (CTE) — договори на компанијата
|
kbnteam.company | JOIN — компанија
|
Излезни колони
| Колона | Извор | Опис
|
|---|
invoice_id | invoice | Примарен клуч на фактурата
|
comp_order_id | invoice | Поврзана компаниска нарачка
|
company_id | company | ID на компанијата
|
company_name | company | Назив на компанијата
|
company_address | company | Адреса на компанијата
|
delivery_id | company_order | ID на доставата
|
customer_order_count | CTE invoice_totals | Број нарачки на купувачи
|
invoice_amount | CTE invoice_totals | Вкупен износ на фактурата
|
contract_count | CTE company_contracts | Број на договори на компанијата
|
SQL Дефиниција
CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS
WITH company_contracts AS (
SELECT
ct.company_id,
COUNT(*) AS contract_count
FROM kbnteam.contract ct
GROUP BY ct.company_id
),
invoice_totals AS (
SELECT
i.invoice_id,
i.comp_order_id,
co.company_id,
co.delivery_id,
COUNT(o.order_id) AS customer_order_count,
COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount
FROM kbnteam.invoice i
JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id
LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id
GROUP BY i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id
)
SELECT
it.invoice_id,
it.comp_order_id,
cmp.company_id,
cmp.company_name,
cmp.company_address,
it.delivery_id,
it.customer_order_count,
it.invoice_amount,
COALESCE(cc.contract_count, 0) AS contract_count
FROM invoice_totals it
JOIN kbnteam.company cmp ON cmp.company_id = it.company_id
LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id;
Тестирање на перформанси
Препорачано тест прашање
SET search_path TO kbnteam;
SET statement_timeout = '60s';
-- Тест 1: по компанија
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_company_billing_overview
WHERE company_id = 1;
-- Тест 2: по компаниска нарачка
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_company_billing_overview
WHERE comp_order_id = 1;
Резултати пред индексирање
| Метрика | Тест 1 (company_id) | Тест 2 (comp_order_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| contract scan | _ | _
|
| customer_order scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
Применети индекси
-- indexes/v_company_billing_overview_index.sql
CREATE INDEX IF NOT EXISTS idx_contract_company_id
ON kbnteam.contract (company_id);
CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id
ON kbnteam.customer_order (comp_order_id);
Резултати по индексирање
| Метрика | Тест 1 (company_id) | Тест 2 (comp_order_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| contract scan | _ | _
|
| customer_order scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
Анализа на подобрување
| Индекс | Помага на | Очекувана промена
|
|---|
idx_contract_company_id | CTE company_contracts GROUP BY | Seq Scan → Index Scan на contract
|
idx_customer_order_comp_order_id | CTE invoice_totals LEFT JOIN | Seq Scan → Index Scan на customer_order
|
| Метрика | Пред | По | Δ Подобрување
|
|---|
| Execution Time (Тест 1) | _ ms | _ ms | _ %
|
| Execution Time (Тест 2) | _ ms | _ ms | _ %
|