= Преглед: v_company_billing_overview = ||= Својство ||= Вредност || || Шема || `kbnteam` || || Категорија || Фактурирање || || Поврзани индекси || [wiki:CompanyBillingOverviewIndex Индекси за фактурирање] || == Опис == За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата. Износот на фактурата е збир од поврзаните клиентски нарачки. Бројот на договори се пресметува одделно. Фактурите без клиентски нарачки имаат број и износ еднакви на нула. Еден ред за секоја фактура. Износот е збир од нарачките, а не пресметка на платено или преостанато салдо. == Зависности == ||= Табела / преглед ||= Употреба || || `kbnteam.contract` || Договори меѓу компаниите и рестораните. || || `kbnteam.invoice` || Фактури поврзани со компаниските нарачки. || || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || || `kbnteam.company` || Податоци за компаниите. || || `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. || == Излезни колони == ||= Колона ||= Извор / пресметка ||= Опис || || `invoice_id` || `invoice.invoice_id` || Идентификатор на фактурата. || || `comp_order_id` || `invoice.comp_order_id` || Идентификатор на компаниската нарачка. || || `company_id` || `company.company_id` || Идентификатор на компанијата. || || `company_name` || `company.company_name` || Назив на компанијата. || || `company_address` || `company.company_address` || Адреса на компанијата. || || `delivery_id` || `company_order.delivery_id` || Идентификатор на доставата. || || `customer_order_count` || `COUNT(customer_order.order_id)` || Број на клиентски нарачки. || || `invoice_amount` || `COALESCE(SUM(customer_order.order_total), 0)::numeric(14,2)` || Збир на износите на нарачките поврзани со фактурата. || || `contract_count` || `COALESCE(company_contracts.contract_count, 0)` || Број на договори на компанијата. || == SQL дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS WITH company_contracts AS ( SELECT company_id, COUNT(*) AS contract_count FROM kbnteam.contract GROUP BY company_id ) SELECT i.invoice_id, i.comp_order_id, cmp.company_id, cmp.company_name, cmp.company_address, co.delivery_id, COUNT(o.order_id) AS customer_order_count, COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount, COALESCE(cc.contract_count, 0) AS contract_count FROM kbnteam.invoice i JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id JOIN kbnteam.company cmp ON cmp.company_id = co.company_id LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id GROUP BY i.invoice_id, i.comp_order_id, cmp.company_id, cmp.company_name, cmp.company_address, co.delivery_id, cc.contract_count; }}} == Тестирање на перформанси == Мерењата се евидентирани во DBeaver на 14 септември 2026 година. „Пред индексирање“ и „по индексирање“ ги означуваат групите наведени како „без индекси“ и „со индекси“ во евиденцијата. Точниот сет присутни индекси во секоја група не е евидентиран; „без индекси“ не потврдува отсуство на индекси од примарни и уникатни клучеви. Наведените времиња се клиентски мерења од DBeaver, а не серверските Planning Time и Execution Time од EXPLAIN ANALYZE. Нема приложени планови, типови на скенирање или податоци за баферите. Вредностите се во милисекунди (ms). === Измерен прашалник === {{{ #!sql SELECT * FROM kbnteam.v_company_billing_overview WHERE company_id = 250; }}} === Резултати пред индексирање === ||= Метрика ||= Измерен резултат || || Клиентско време (ms) || 108 || || Приказ на мерењето || Време прикажано со резултатот во DBeaver || || Прикажани / преземени редови || 12 || || Planning Time / Execution Time од EXPLAIN || Не се измерени || || План, тип на скенирање и бафери || Не се приложени || === Дополнителни и заеднички индекси === `invoice(comp_order_id)` има уникатен индекс. За пребарувањето и агрегациите се користат заедничките индекси за нарачки и договори; не е потребен посебен индекс само на contract(company_id). ||= Индекс ||= Табела и колони ||= Намена || || `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. || || `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. || || `idx_contract_company_id_rest_id` || `contract(company_id, rest_id)` || Пребарување договори по компанија и ресторан и групирање по компанија. || {{{ #!sql CREATE INDEX IF NOT EXISTS idx_company_order_company_id ON kbnteam.company_order (company_id); CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id ON kbnteam.customer_order (comp_order_id); CREATE INDEX IF NOT EXISTS idx_contract_company_id_rest_id ON kbnteam.contract (company_id, rest_id); }}} === Проверка на индексите === {{{ #!sql SELECT tablename, indexname, indexdef FROM pg_indexes WHERE schemaname = 'kbnteam' AND indexname IN ( 'idx_company_order_company_id', 'idx_customer_order_comp_order_id', 'idx_contract_company_id_rest_id' ) ORDER BY tablename, indexname; }}} === Резултати по индексирање === ||= Метрика ||= Измерен резултат || || Клиентско време (ms) || 118 || || Приказ на мерењето || Време прикажано со резултатот во DBeaver || || Прикажани / преземени редови || 12 || || Planning Time / Execution Time од EXPLAIN || Не се измерени || || План, тип на скенирање и бафери || Не се приложени || === Анализа на резултатите === ||= Метрика ||= Пред ||= По ||= Промена на времето || || Клиентско време (ms) || 108 || 118 || +9,3% || Времето е подолго за 10 ms (9,3%). Во ова мерење нема забрзување по индексирањето. Малата апсолутна разлика бара повторени мерења пред да се заклучи дека постои трајно влошување. Промената се пресметува како 100 × (време по - време пред) / време пред. Негативна вредност значи пократко време, а позитивна подолго време. Процентот ја опишува разликата меѓу прикажаните вредности. Ова се поединечни набљудувања. Не се евидентирани контролирани повторувања, исти услови за кеширање и оптоварување или точните дефиниции на присутните индекси. Затоа промената на времето не е доказ дека индексите се единствената причина. Не се приложени мерења за INSERT, UPDATE и DELETE. === Дополнително тестирање - сè уште неизмерено === Следниот прашалник служи за ново мерење на серверскиот план со истиот филтер. Неговите резултати не се пополнети со клиентските времиња наведени погоре. За споредба се задржуваат исти податоци и поставки, се евидентираат присутните индекси, се ажурираат статистиките и се прават повеќе повторувања во двете состојби. Се споредуваат медијаната на времињата и плановите. {{{ #!sql BEGIN READ ONLY; SET LOCAL statement_timeout = '60s'; EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_company_billing_overview WHERE company_id = 250; ROLLBACK; }}} ||= Метрика за дополнителното тестирање ||= Пред ||= По || || Planning Time (ms) || Не е измерено || Не е измерено || || Execution Time (ms) || Не е измерено || Не е измерено || || Тип на скенирање по табела || Не е евидентиран || Не е евидентиран || || Shared Hit Blocks / Shared Read Blocks || Не се измерени || Не се измерени ||