Changes between Version 10 and Version 11 of QueryViewsOptimization


Ignore:
Timestamp:
09/14/26 00:03:45 (13 days ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryViewsOptimization

    v10 v11  
    11= Оптимизација на прашалници и погледи
    22
    3 Оваа страница ги опишува деветте погледи од `Views 2.0` и индексите од `Index 2.0`, усогласени со `schema7.0_dll.sql`.
     3Системот користи погледи за преглед на менито, нарачките, доставите, рецензиите, договорите и лојалноста на клиентите. Индексите го поддржуваат пребарувањето и поврзувањето на податоците.
    44
    55== Погледи
    66
    7 Погледите се креираат по нумеричкиот редослед на SQL датотеките. `v_orders_full` се креира пред `v_driver_deliveries`, бидејќи вториот го користи првиот.
     7Погледите ги обединуваат поврзаните податоци во прегледи наменети за секојдневното работење и известување.
    88
    99=== Мени и каталог
    … …  
    1212
    1313||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
    14 || [wiki:MenuMealView v_menu_meal] || Ги прикажува јадењата со категорија, ресторан, состојки и алергени. || `meal_ingredient`, `ingredient`, `alergen_ingredient`, `alergen`, `meal`, `category`, `restaurant` || Двата CTE изрази користат `string_agg(DISTINCT ... ORDER BY ...)`, без вгнездени `SELECT DISTINCT` прашалници. Јадењата без состојки или алергени остануваат во резултатот со празни листи. ||
     14|| [wiki:MenuMealView v_menu_meal] || Ги прикажува јадењата со категорија, ресторан, состојки и алергени. || `meal_ingredient`, `ingredient`, `alergen_ingredient`, `alergen`, `meal`, `category`, `restaurant` || Состојките и алергените се прикажуваат како азбучно подредени листи без повторувања. Се прикажуваат и јадењата без наведени состојки или алергени. ||
    1515|| [wiki:MenuDrinkView v_menu_drink] || Ги прикажува пијалоците, нивната количина и цена, како и ресторанот. || `drink`, `restaurant` || Едноставно спојување на `drink` и `restaurant`, без агрегации. ||
    1616
    … …  
    2020
    2121||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
    22 || [wiki:OrdersFullView v_orders_full] || Прикажува нарачки со податоци за клиентот, компанијата, статусот, доставата и нарачаните јадења и пијалоци. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `order_status`, `customer`, `api_user`, `company_order`, `company`, `delivery`, `delivery_status` || Списоците се добиваат со `string_agg(DISTINCT ... ORDER BY ...)`. Податоците за доставувачот се земаат директно од `api_user` преку `delivery.driver_user_id`; нема посебно спојување со `driver`. Се задржуваат нарачките без достава. ||
    23 || [wiki:DriverDeliveriesView v_driver_deliveries] || Ги прикажува доставите, доставувачите, рестораните, компаниите и поврзаните нарачки. || `delivery`, `delivery_status`, `driver`, `api_user`, `restaurant`, `company_order`, `company`, `v_orders_full` || Го користи `v_orders_full` за деталите за клиентот и списоците со јадења и пијалоци. `LEFT JOIN` ги задржува и доставите без доставувач, компаниска нарачка или клиентски нарачки. ||
     22|| [wiki:OrdersFullView v_orders_full] || Прикажува нарачки со податоци за клиентот, компанијата, статусот, доставата и нарачаните јадења и пијалоци. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `order_status`, `customer`, `api_user`, `company_order`, `company`, `delivery`, `delivery_status` || Јадењата и пијалоците се прикажуваат во подредени листи без повторувања. Податоците за доставувачот се поврзани со доставата. Се прикажуваат и нарачките за кои сè уште нема достава. ||
     23|| [wiki:DriverDeliveriesView v_driver_deliveries] || Ги прикажува доставите, доставувачите, рестораните, компаниите и поврзаните нарачки. || `delivery`, `delivery_status`, `driver`, `api_user`, `restaurant`, `company_order`, `company`, `v_orders_full` || Го користи прегледот на нарачки за деталите за клиентот и нарачаните производи. Се прикажуваат и доставите без назначен доставувач или поврзани нарачки. ||
    2424
    2525=== Рецензии
    … …  
    2828
    2929||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
    30 || [wiki:ReviewsFullView v_reviews_full] || Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата. || `review`, `order_review`, `customer_order`, `api_user`, `company_order`, `company`, `delivery_review`, `delivery` || Користи `UNION ALL`. Отстранети се посредните спојувања со `customer` и `driver`; корисничките податоци се земаат директно од `api_user`. Ако една рецензија има записи во двата поттипа, се прикажуваат двата записа. ||
     30|| [wiki:ReviewsFullView v_reviews_full] || Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата. || `review`, `order_review`, `customer_order`, `api_user`, `company_order`, `company`, `delivery_review`, `delivery` || Секој запис го задржува типот на рецензијата и соодветните оценки. Ако една рецензија се однесува и на нарачка и на достава, се прикажуваат двата записа. ||
    3131
    3232=== Договори, фактурирање и лојалност
    … …  
    3535
    3636||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
    37 || [wiki:ContractsRevenueView v_contracts_revenue] || За секој договор ги прикажува бројот на компаниски и клиентски нарачки и вкупниот приход за парот компанија–ресторан. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `company_order`, `contract`, `company`, `restaurant`, `contract_status` || `UNION` ги отстранува повторувањата на парот нарачка–ресторан. Нема филтер за активен договор, датум или статус на нарачка. Целиот износ на нарачката се брои кај секој вклучен ресторан, а истата статистика се повторува кај договорите за истиот пар компанија–ресторан. ||
    38 || [wiki:CompanyBillingOverviewView v_company_billing_overview] || За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата. || `contract`, `invoice`, `company_order`, `company`, `customer_order` || Износот и бројот на нарачки се пресметуваат во главниот прашалник. Договорите се бројат во посебен CTE за да не го умножат износот. Фактурите без клиентски нарачки имаат број и износ еднакви на нула. ||
    39 || [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2] || Ги прикажува клиентот, компанијата, поените, статусот и нивото на лојалност, бројот на нарачки, вкупната потрошувачка и датумот на последната нарачка. || `customer_order`, `customer_loyalty`, `customer`, `company`, `api_user`, `customer_loyalty_status`, `loyalty_tier` || CTE изразот `order_stats` пресметува `COUNT`, `SUM` и `MAX` по клиент. Статистиката ги опфаќа сите статуси на нарачки. Се прикажуваат клиентите со запис во `customer_loyalty`, вклучувајќи ги и оние без нарачки. ||
     37|| [wiki:ContractsRevenueView v_contracts_revenue] || За секој договор ги прикажува бројот на компаниски и клиентски нарачки и вкупниот приход за парот компанија–ресторан. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `company_order`, `contract`, `company`, `restaurant`, `contract_status` || Статистиката ги опфаќа сите нарачки, независно од датумот и статусот на договорот или нарачката. Целиот износ на нарачката се брои кај секој вклучен ресторан. Договорите за истиот пар компанија–ресторан ја прикажуваат истата статистика. ||
     38|| [wiki:CompanyBillingOverviewView v_company_billing_overview] || За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата. || `contract`, `invoice`, `company_order`, `company`, `customer_order` || Износот на фактурата е збир од поврзаните клиентски нарачки. Бројот на договори се пресметува одделно. Фактурите без клиентски нарачки имаат број и износ еднакви на нула. ||
     39|| [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2] || Ги прикажува клиентот, компанијата, поените, статусот и нивото на лојалност, бројот на нарачки, вкупната потрошувачка и датумот на последната нарачка. || `customer_order`, `customer_loyalty`, `customer`, `company`, `api_user`, `customer_loyalty_status`, `loyalty_tier` || Статистиката се пресметува по клиент и ги опфаќа сите статуси на нарачки. Се прикажуваат членовите на програмата за лојалност, вклучувајќи ги и оние без нарачки. ||
    4040
    4141=== Термини за ручек
    … …  
    4848== Индекси
    4949
    50 Индексите се поставуваат врз изворните табели, бидејќи овие погледи не се материјализирани. Деветте датотеки во `Index 2.0` содржат вкупно 14 различни дефиниции на индекси. Заедничките индекси се дефинирани само еднаш. Датотеките за менито со пијалоци, рецензиите и фактурирањето содржат објаснувања за постојните и заедничките индекси, без нови `CREATE INDEX` наредби.
     50Индексите се поврзани со изворните табели и го поддржуваат пребарувањето по компанија, клиент, ресторан, доставувач и нарачка. Еден индекс може да се користи од повеќе погледи.
    5151
    52 Дефинициите користат `CREATE INDEX IF NOT EXISTS`. Оваа проверка е по име и не ја менува дефиницијата на веќе постоен индекс со исто име. Индексите од `PRIMARY KEY` и `UNIQUE` ограничувањата остануваат дел од шемата.
     52Примарните клучеви и уникатните ограничувања обезбедуваат основни индекси за идентификација и поврзување на записите. Дополнителните индекси ги поддржуваат почестите пребарувања и групирања.
    5353
    5454=== Индекси за мени
    5555
    56 ||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
    57 || [wiki:MenuMealIndex Index 2.0/02_v_menu_meal_index.sql] || `meal(cat_id, meal_id)`, `meal_ingredient(meal_id, ingr_id)`, `alergen_ingredient(ingr_id, alergen_id)` || `v_menu_meal` || Ги поддржува пребарувањето по категорија и врските јадење–состојки–алергени. `meal(rest_id, meal_name)` веќе е покриен со `UNIQUE`. ||
    58 || `Index 2.0/01_v_menu_drink_index.sql` || Нема нови дефиниции || `v_menu_drink` || Нема дополнителен индекс. `restaurant(rest_id)` е примарен клуч, а `drink(rest_id, drink_name)` веќе има `UNIQUE` индекс. ||
     56||= Област ||= Индекси ||= Поддржани погледи ||= Забелешки ||
     57|| [wiki:MenuMealIndex Мени со јадења] || `meal(cat_id, meal_id)`, `meal_ingredient(meal_id, ingr_id)`, `alergen_ingredient(ingr_id, alergen_id)` || `v_menu_meal` || Ги поддржува пребарувањето по категорија и врските јадење–состојки–алергени. `meal(rest_id, meal_name)` веќе е покриен со `UNIQUE`. ||
     58|| Мени со пијалоци || Основни и заеднички индекси || `v_menu_drink` || Нема дополнителен индекс. `restaurant(rest_id)` е примарен клуч, а `drink(rest_id, drink_name)` веќе има `UNIQUE` индекс. ||
    5959
    6060=== Индекси за нарачки, достави и рецензии
    6161
    62 ||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
    63 || [wiki:OrdersFullIndex Index 2.0/03_v_orders_full_index.sql] || `company_order(company_id)`, `customer_order(comp_order_id)`, `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)` || `v_orders_full`, `v_driver_deliveries`, `v_contracts_revenue`, `v_company_billing_overview`, `v_reviews_full` || Заеднички индекси за пронаоѓање компаниски и клиентски нарачки и за поврзување на јадењата и пијалоците по нарачка. Индексите по доставувач и клиент се дефинирани во датотеките 05 и 07. ||
    64 || [wiki:DriverDeliveriesIndex Index 2.0/05_v_driver_deliveries_index.sql] || `delivery(driver_user_id, delivery_date)` || `v_driver_deliveries`, `v_orders_full`, `v_reviews_full` || Пребарување по доставувач и датум. Ги користи и индексите од датотека 03; индексот за `driver(rest_id)` е во датотека 08. ||
    65 || [wiki:ReviewsFullIndex Index 2.0/04_v_reviews_full_index.sql] || Нема нови дефиниции || `v_reviews_full` || Нема дополнителен индекс. Врските преку `review_id`, `order_id` и `delivery_id` се покриени со примарни и уникатни клучеви. Се користат и заедничките индекси од датотеките 03, 05 и 07. ||
     62||= Област ||= Индекси ||= Поддржани погледи ||= Забелешки ||
     63|| [wiki:OrdersFullIndex Нарачки] || `company_order(company_id)`, `customer_order(comp_order_id)`, `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)` || `v_orders_full`, `v_driver_deliveries`, `v_contracts_revenue`, `v_company_billing_overview`, `v_reviews_full` || Заеднички индекси за пронаоѓање компаниски и клиентски нарачки и за поврзување на јадењата и пијалоците по нарачка. Пребарувањата по доставувач и клиент се поддржани и со индексите за достави и лојалност. ||
     64|| [wiki:DriverDeliveriesIndex Достави] || `delivery(driver_user_id, delivery_date)` || `v_driver_deliveries`, `v_orders_full`, `v_reviews_full` || Пребарување по доставувач и датум. Се користат и заедничките индекси за нарачки и за поврзување на доставувачите со рестораните. ||
     65|| [wiki:ReviewsFullIndex Рецензии] || Основни и заеднички индекси || `v_reviews_full` || Нема дополнителен индекс. Врските преку `review_id`, `order_id` и `delivery_id` се покриени со примарни и уникатни клучеви. Се користат и заедничките индекси за нарачки, достави и клиенти. ||
    6666
    6767=== Индекси за договори, фактурирање, лојалност и термини
    6868
    69 ||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
    70 || [wiki:ContractsRevenueIndex Index 2.0/06_v_contracts_revenue_index.sql] || `contract(company_id, rest_id)` || `v_contracts_revenue`, `v_company_billing_overview` || Водечката колона `company_id` поддржува и групирање на договорите за фактурирање. Не се додава посебен индекс само на `contract(company_id)`. Индексите за нарачките се во датотека 03. ||
    71 || [wiki:CompanyBillingOverviewIndex Index 2.0/09_v_company_billing_overview_index.sql] || Нема нови дефиниции || `v_company_billing_overview` || Нема дополнителен индекс. Ги користи `company_order(company_id)` и `customer_order(comp_order_id)` од датотека 03 и `contract(company_id, rest_id)` од датотека 06. `invoice(comp_order_id)` веќе има `UNIQUE` индекс. ||
    72 || [wiki:CustomerLoyaltyFullIndex Index 2.0/07_v_customer_loyalty_full_v2_index.sql] || `customer_order(customer_user_id, order_datetime DESC)`, `customer(company_id)` || `v_customer_loyalty_full_v2`, `v_orders_full` || Пребарување на нарачки по клиент и датум и на клиенти по компанија. `customer_loyalty(user_id)` веќе има `UNIQUE` индекс. За сумата на потрошувачката и натаму се чита `order_total`. ||
    73 || [wiki:DriverLunchTimersIndex Index 2.0/08_v_driver_lunch_timers_index.sql] || `driver(rest_id)`, `contract(rest_id, company_id)`, `lunch_time(contract_id)` || `v_driver_lunch_timers`, `v_driver_deliveries`; пребарување договори по ресторан во `v_contracts_revenue` || Ги поддржува врските ресторан–доставувач, ресторан–договор и договор–термин. Индексот на `lunch_time` започнува со `contract_id`, па не бара филтер по ден. ||
     69||= Област ||= Индекси ||= Поддржани погледи ||= Забелешки ||
     70|| [wiki:ContractsRevenueIndex Договори и приходи] || `contract(company_id, rest_id)` || `v_contracts_revenue`, `v_company_billing_overview` || Водечката колона `company_id` поддржува и групирање на договорите за фактурирање. Истиот индекс поддржува пребарување само по компанија. За нарачките се користат заедничките индекси. ||
     71|| [wiki:CompanyBillingOverviewIndex Фактурирање] || Основни и заеднички индекси || `v_company_billing_overview` || Нема дополнителен индекс. Ги користи заедничките индекси `company_order(company_id)`, `customer_order(comp_order_id)` и `contract(company_id, rest_id)`. `invoice(comp_order_id)` веќе има `UNIQUE` индекс. ||
     72|| [wiki:CustomerLoyaltyFullIndex Лојалност на клиентите] || `customer_order(customer_user_id, order_datetime DESC)`, `customer(company_id)` || `v_customer_loyalty_full_v2`, `v_orders_full` || Пребарување на нарачки по клиент и датум и на клиенти по компанија. `customer_loyalty(user_id)` веќе има `UNIQUE` индекс. За сумата на потрошувачката и натаму се чита `order_total`. ||
     73|| [wiki:DriverLunchTimersIndex Термини за ручек] || `driver(rest_id)`, `contract(rest_id, company_id)`, `lunch_time(contract_id)` || `v_driver_lunch_timers`, `v_driver_deliveries`; пребарување договори по ресторан во `v_contracts_revenue` || Ги поддржува врските ресторан–доставувач, ресторан–договор и договор–термин. Индексот на `lunch_time` започнува со `contract_id`, па не бара филтер по ден. ||
    7474
    7575== Тестирање на базата пред користење на индексите
    7676
    77 Овој дел е оставен за мерењата пред додавање на дополнителните индекси од `Index 2.0`. Во основната состојба остануваат индексите создадени со `PRIMARY KEY` и `UNIQUE`. Ако претходно се применети дополнителните индекси од `index/`, тие треба да се евидентираат; таквото мерење не претставува основна состојба без дополнителни индекси.
     77Тестирањето пред дополнителното индексирање служи за утврдување на почетните перформанси на прашалниците. Основните индекси од примарните клучеви и уникатните ограничувања остануваат присутни.
    7878
    7979=== Податоци и услови за тестирање
    8080
    81 [Да се внесат верзијата на PostgreSQL, бројот на записи, постојните индекси, условите за кеширање, состојбата на статистиките и бројот на повторувања.]
     81
    8282
    8383=== Прашалници и планови за извршување
    8484
    85 [Простор за SQL прашалници со конкретни филтри, излез од `EXPLAIN (ANALYZE, BUFFERS)` и слики од тестирањето.]
     85
    8686
    8787=== Резултати пред индексите
    8888
    89 ||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План / buffers / забелешки ||
     89||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План на извршување / забелешки ||
    9090|| `v_menu_drink` ||  ||  ||  ||
    9191|| `v_menu_meal` ||  ||  ||  ||
    … …  
    100100== Тестирање на базата по користење на индексите
    101101
    102 Овој дел е оставен за мерењата по примената на индексите од `Index 2.0`. Се користат истите податоци, прашалници, филтри, услови за кеширање и број на повторувања како во претходниот дел, со ажурирани статистики за табелите во двете состојби.
     102Тестирањето по дополнителното индексирање служи за споредба со почетните перформанси. Споредбата се заснова на исти податоци, прашалници и услови за извршување.
    103103
    104104=== Применети индекси
    105105
    106 [Простор за список на индексите што навистина се присутни во базата и потврда за применетите SQL датотеки.]
     106
    107107
    108108=== Прашалници и планови за извршување
    109109
    110 [Простор за истиот сет SQL прашалници, излез од `EXPLAIN (ANALYZE, BUFFERS)` и слики од тестирањето.]
     110
    111111
    112112=== Резултати по индексите
    113113
    114 ||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План / buffers / забелешки ||
     114||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План на извршување / забелешки ||
    115115|| `v_menu_drink` ||  ||  ||  ||
    116116|| `v_menu_meal` ||  ||  ||  ||
    … …  
    124124
    125125=== Споредба и заклучок
    126 
    127 [Простор за споредба на времињата, плановите и прочитаните блокови пред и по индексите. Да се евидентираат и прашалниците кај кои нема подобрување. Изборот на индекс зависи од податоците и филтрите; целосните прегледи и агрегации можат да користат секвенцијално читање.]