= Преглед: 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; }}} == Тестирање на перформанси == Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби. === Тест прашалници === {{{ #!sql BEGIN READ ONLY; SET LOCAL 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; ROLLBACK; }}} === Резултати пред индексирање === Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед. ||= Метрика ||= Тест 1 (по компанија) ||= Тест 2 (по компаниска нарачка) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || Начин на читање по табела || ___ || ___ || || Shared Hit Blocks || ___ || ___ || || Shared Read Blocks || ___ || ___ || {{{ -- Планови и резултати пред дополнителното индексирање: }}} === Дополнителни и заеднички индекси === `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; }}} === Резултати по индексирање === Мерењето ги користи истите тест прашалници и услови како почетното мерење. ||= Метрика ||= Тест 1 (по компанија) ||= Тест 2 (по компаниска нарачка) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || Начин на читање по табела || ___ || ___ || || Shared Hit Blocks || ___ || ___ || || Shared Read Blocks || ___ || ___ || {{{ -- Планови и резултати по дополнителното индексирање: }}} === Анализа на подобрување === ||= Метрика ||= Пред ||= По ||= Промена (%) || || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување. Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.