= Преглед: 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; }}} == Индексна поддршка == `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; }}} == Тестирање на перформанси == === SELECT === Времето на извршување на SELECT прашалникот е прифатливо за редовното користење на погледот. Постоечката индексна поддршка е доволна за тестираните прашалници. === INSERT и UPDATE === Тестирани се по еден INSERT и еден UPDATE врз `kbnteam.invoice`, главната табела на погледот. Се тестира додавање фактура и промена на поврзаната компаниска нарачка. ||= Операција ||= Execute (ms) ||= Fetch (ms) ||= Вратени редови || || INSERT || 14 || 13 || 1 || || UPDATE || 16 || 14 || 1 || Execute е времето на извршување прикажано во DBeaver. Fetch вредностите се преземени од дополнетата евиденција на тестирањето. Ова се клиентски времиња, изразени во милисекунди. Двете операции се успешни и враќаат по еден ред преку RETURNING. По мерењето промените се вратени со ROLLBACK. INSERT и UPDATE се извршуваат со прифатлива брзина. Овие мерења ја опишуваат тестираната состојба на базата и не се споредба пред и по индексирање.