Changes between Version 1 and Version 2 of CompanyBillingOverviewView


Ignore:
Timestamp:
09/14/26 00:43:11 (2 weeks ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CompanyBillingOverviewView

    v1 v2  
    11= Преглед: v_company_billing_overview =
    22
    3 ||= Датотека ||= `views/08_company_billing_view.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Категорија ||= Договори, Фактурирање и Верност ||
    6 ||= Поврзани индекси ||= `indexes/v_company_billing_overview_index.sql` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Категорија || Фактурирање ||
     6|| Поврзани индекси || [wiki:CompanyBillingOverviewIndex Индекси за фактурирање] ||
    77
    88== Опис ==
    9 Прикажува вкупни износи на фактури, бројот на нарачки на купувачи и бројот на договори по компанија. Користи два CTE: `company_contracts` го брои бројот на договори по компанија, а `invoice_totals` ги агрегира вкупните износи по фактура. Важен преглед за финансиски извештај и прикажување на фактури во администраторски панел.
     9
     10За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата.
     11
     12Износот на фактурата е збир од поврзаните клиентски нарачки. Бројот на договори се пресметува одделно. Фактурите без клиентски нарачки имаат број и износ еднакви на нула.
     13
     14Еден ред за секоја фактура. Износот е збир од нарачките, а не пресметка на платено или преостанато салдо.
    1015
    1116== Зависности ==
    12 ||= Табела ||= Тип на употреба ||
    13 || `kbnteam.invoice` || Главна табела ||
    14 || `kbnteam.company_order` || JOIN — компаниска нарачка ||
    15 || `kbnteam.customer_order` || LEFT JOIN — нарачки (за вкупен износ) ||
    16 || `kbnteam.contract` || LEFT JOIN (CTE) — договори на компанијата ||
    17 || `kbnteam.company` || JOIN — компанија ||
     17
     18||= Табела / преглед ||= Употреба ||
     19|| `kbnteam.contract` || Договори меѓу компаниите и рестораните. ||
     20|| `kbnteam.invoice` || Фактури поврзани со компаниските нарачки. ||
     21|| `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. ||
     22|| `kbnteam.company` || Податоци за компаниите. ||
     23|| `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. ||
    1824
    1925== Излезни колони ==
    20 ||= Колона ||= Извор ||= Опис ||
    21 || `invoice_id` || `invoice` || Примарен клуч на фактурата ||
    22 || `comp_order_id` || `invoice` || Поврзана компаниска нарачка ||
    23 || `company_id` || `company` || ID на компанијата ||
    24 || `company_name` || `company` || Назив на компанијата ||
    25 || `company_address` || `company` || Адреса на компанијата ||
    26 || `delivery_id` || `company_order` || ID на доставата ||
    27 || `customer_order_count` || CTE `invoice_totals` || Број нарачки на купувачи ||
    28 || `invoice_amount` || CTE `invoice_totals` || Вкупен износ на фактурата ||
    29 || `contract_count` || CTE `company_contracts` || Број на договори на компанијата ||
    3026
    31 == SQL Дефиниција ==
     27||= Колона ||= Извор / пресметка ||= Опис ||
     28|| `invoice_id` || `invoice.invoice_id` || Идентификатор на фактурата. ||
     29|| `comp_order_id` || `invoice.comp_order_id` || Идентификатор на компаниската нарачка. ||
     30|| `company_id` || `company.company_id` || Идентификатор на компанијата. ||
     31|| `company_name` || `company.company_name` || Назив на компанијата. ||
     32|| `company_address` || `company.company_address` || Адреса на компанијата. ||
     33|| `delivery_id` || `company_order.delivery_id` || Идентификатор на доставата. ||
     34|| `customer_order_count` || `COUNT(customer_order.order_id)` || Број на клиентски нарачки. ||
     35|| `invoice_amount` || `COALESCE(SUM(customer_order.order_total), 0)::numeric(14,2)` || Збир на износите на нарачките поврзани со фактурата. ||
     36|| `contract_count` || `COALESCE(company_contracts.contract_count, 0)` || Број на договори на компанијата. ||
     37
     38== SQL дефиниција ==
     39
    3240{{{
    3341#!sql
    3442CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS
    3543WITH company_contracts AS (
    36     SELECT
    37         ct.company_id,
    38         COUNT(*) AS contract_count
    39     FROM kbnteam.contract ct
    40     GROUP BY ct.company_id
    41 ),
    42 invoice_totals AS (
    43     SELECT
    44         i.invoice_id,
    45         i.comp_order_id,
    46         co.company_id,
    47         co.delivery_id,
    48         COUNT(o.order_id) AS customer_order_count,
    49         COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount
    50     FROM kbnteam.invoice i
    51     JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id
    52     LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id
    53     GROUP BY i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id
     44    SELECT company_id, COUNT(*) AS contract_count
     45    FROM kbnteam.contract
     46    GROUP BY company_id
    5447)
    5548SELECT
    56     it.invoice_id,
    57     it.comp_order_id,
     49    i.invoice_id,
     50    i.comp_order_id,
    5851    cmp.company_id,
    5952    cmp.company_name,
    6053    cmp.company_address,
    61     it.delivery_id,
    62     it.customer_order_count,
    63     it.invoice_amount,
     54    co.delivery_id,
     55    COUNT(o.order_id) AS customer_order_count,
     56    COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount,
    6457    COALESCE(cc.contract_count, 0) AS contract_count
    65 FROM invoice_totals it
    66 JOIN kbnteam.company cmp ON cmp.company_id = it.company_id
    67 LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id;
     58FROM kbnteam.invoice i
     59JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id
     60JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
     61LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id
     62LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id
     63GROUP BY i.invoice_id, i.comp_order_id, cmp.company_id,
     64         cmp.company_name, cmp.company_address, co.delivery_id, cc.contract_count;
    6865}}}
    6966
    7067== Тестирање на перформанси ==
    7168
    72 === Препорачано тест прашање ===
     69Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби.
     70
     71=== Тест прашалници ===
     72
    7373{{{
    7474#!sql
    75 SET search_path TO kbnteam;
    76 SET statement_timeout = '60s';
     75BEGIN READ ONLY;
     76SET LOCAL statement_timeout = '60s';
    7777
    7878-- Тест 1: по компанија
    … …  
    8585SELECT * FROM kbnteam.v_company_billing_overview
    8686WHERE comp_order_id = 1;
     87
     88ROLLBACK;
    8789}}}
    8890
    8991=== Резултати пред индексирање ===
    90 ||= Метрика ||= Тест 1 (company_id) ||= Тест 2 (comp_order_id) ||
     92
     93Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.
     94
     95||= Метрика ||= Тест 1 (по компанија) ||= Тест 2 (по компаниска нарачка) ||
    9196|| Planning Time || ___ ms || ___ ms ||
    9297|| Execution Time || ___ ms || ___ ms ||
    9398|| Rows Returned || ___ || ___ ||
    94 || contract scan || ___ || ___ ||
    95 || customer_order scan || ___ || ___ ||
     99|| Начин на читање по табела || ___ || ___ ||
     100|| Shared Hit Blocks || ___ || ___ ||
     101|| Shared Read Blocks || ___ || ___ ||
    96102
    97103{{{
    98 -- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     104-- Планови и резултати пред дополнителното индексирање:
     105
    99106}}}
    100107
    101 === Применети индекси ===
     108=== Дополнителни и заеднички индекси ===
     109
     110`invoice(comp_order_id)` има уникатен индекс. За пребарувањето и агрегациите се користат заедничките индекси за нарачки и договори; не е потребен посебен индекс само на contract(company_id).
     111
     112||= Индекс ||= Табела и колони ||= Намена ||
     113|| `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. ||
     114|| `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. ||
     115|| `idx_contract_company_id_rest_id` || `contract(company_id, rest_id)` || Пребарување договори по компанија и ресторан и групирање по компанија. ||
     116
    102117{{{
    103118#!sql
    104 -- indexes/v_company_billing_overview_index.sql
    105 CREATE INDEX IF NOT EXISTS idx_contract_company_id
    106 ON kbnteam.contract (company_id);
     119CREATE INDEX IF NOT EXISTS idx_company_order_company_id
     120ON kbnteam.company_order (company_id);
    107121
    108122CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id
    109123ON kbnteam.customer_order (comp_order_id);
     124
     125CREATE INDEX IF NOT EXISTS idx_contract_company_id_rest_id
     126ON kbnteam.contract (company_id, rest_id);
     127}}}
     128
     129=== Проверка на индексите ===
     130
     131{{{
     132#!sql
     133SELECT tablename, indexname, indexdef
     134FROM pg_indexes
     135WHERE schemaname = 'kbnteam'
     136  AND indexname IN (
     137    'idx_company_order_company_id',
     138    'idx_customer_order_comp_order_id',
     139    'idx_contract_company_id_rest_id'
     140)
     141ORDER BY tablename, indexname;
    110142}}}
    111143
    112144=== Резултати по индексирање ===
    113 ||= Метрика ||= Тест 1 (company_id) ||= Тест 2 (comp_order_id) ||
     145
     146Мерењето ги користи истите тест прашалници и услови како почетното мерење.
     147
     148||= Метрика ||= Тест 1 (по компанија) ||= Тест 2 (по компаниска нарачка) ||
    114149|| Planning Time || ___ ms || ___ ms ||
    115150|| Execution Time || ___ ms || ___ ms ||
    116151|| Rows Returned || ___ || ___ ||
    117 || contract scan || ___ || ___ ||
    118 || customer_order scan || ___ || ___ ||
     152|| Начин на читање по табела || ___ || ___ ||
     153|| Shared Hit Blocks || ___ || ___ ||
     154|| Shared Read Blocks || ___ || ___ ||
    119155
    120156{{{
    121 -- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     157-- Планови и резултати по дополнителното индексирање:
     158
    122159}}}
    123160
    124161=== Анализа на подобрување ===
    125 ||= Индекс ||= Помага на ||= Очекувана промена ||
    126 || `idx_contract_company_id` || CTE `company_contracts` GROUP BY || Seq Scan → Index Scan на `contract` ||
    127 || `idx_customer_order_comp_order_id` || CTE `invoice_totals` LEFT JOIN || Seq Scan → Index Scan на `customer_order` ||
    128162
    129 ||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     163||= Метрика ||= Пред ||= По ||= Промена (%) ||
    130164|| Execution Time (Тест 1) || ___ ms || ___ ms || ___ % ||
    131165|| Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||
     166
     167Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување.
     168
     169Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.