Changes between Version 1 and Version 2 of CustomerLoyaltyFullIndex


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

--

Legend:

Unmodified
Added
Removed
Modified
  • CustomerLoyaltyFullIndex

    v1 v2  
    1 = Индекс: v_customer_loyalty_full_v2_index =
     1= Индекси: v_customer_loyalty_full_v2_index =
    22
    3 ||= Датотека ||= `indexes/v_customer_loyalty_full_v2_index.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Поврзани прегледи ||= `v_customer_loyalty_full_v2`, `v_customer_loyalty_full`, `v_orders_full` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Област || Лојалност на клиентите ||
     6|| Главен преглед || [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2] ||
    67
    78== Опис ==
    8 Единечен композитен индекс за поддршка на CTE-то `order_stats` во прегледот `v_customer_loyalty_full_v2`. Ги агрегира бројот на нарачки, вкупниот потрошен износ и датумот на последна нарачка по купувач. Колоната `order_datetime DESC` е додадена за поддршка на `MAX(order_datetime)` без Sort операции.
    99
    10 Истиот индекс е дефиниран и во `v_orders_full_index.sql`.
     10Индексите го поддржуваат пристапот до податоците за лојалност на клиентите. Се поставуваат врз изворните табели и можат да се користат од повеќе прегледи.
     11
     12`customer_loyalty(user_id)` има уникатен индекс. Индексот по клиент и датум не го содржи order_total, па пресметката на вкупната потрошувачка и натаму бара читање на износите.
    1113
    1214== DDL ==
     15
    1316{{{
    1417#!sql
    15 -- indexes/v_customer_loyalty_full_v2_index.sql
    1618CREATE INDEX IF NOT EXISTS idx_customer_order_customer_user_id_order_datetime
    1719ON kbnteam.customer_order (customer_user_id, order_datetime DESC);
     20
     21CREATE INDEX IF NOT EXISTS idx_customer_company_id
     22ON kbnteam.customer (company_id);
    1823}}}
    1924
    2025== Поддржани прегледи ==
    21 ||= Преглед ||= Начин на употреба ||
    22 || `v_customer_loyalty_full_v2` || CTE `order_stats` — GROUP BY `customer_user_id`, MAX `order_datetime` ||
    23 || `v_customer_loyalty_full` || Вградено подпрашање — GROUP BY `customer_user_id`, MAX `order_datetime` ||
    24 || `v_orders_full` || WHERE `customer_user_id = ?` и ORDER BY `order_datetime` ||
     26
     27||= Индекс ||= Прегледи ||= Намена ||
     28|| `idx_customer_order_customer_user_id_order_datetime` || [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2], [wiki:OrdersFullView v_orders_full], [wiki:ReviewsFullView v_reviews_full] || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. ||
     29|| `idx_customer_company_id` || [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2], [wiki:OrdersFullView v_orders_full] || Пронаоѓање клиенти по компанијата на која припаѓаат. ||
    2530
    2631== Колонски план ==
    27 ||= Колона ||= Позиција ||= Причина ||
    28 || `customer_user_id` || 1-ва (leading) || Примарен GROUP BY клуч за агрегација на статистики по купувач ||
    29 || `order_datetime DESC` || 2-ра ||MAX(order_datetime) — DESC редослед го избегнува Sort операцијата ||
     32
     33||= Индекс ||= Табела ||= Прва колона ||= Следни колони ||= Намена ||
     34|| `idx_customer_order_customer_user_id_order_datetime` || `customer_order` || `customer_user_id` || `order_datetime DESC` || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. ||
     35|| `idx_customer_company_id` || `customer` || `company_id` || — || Пронаоѓање клиенти по компанијата на која припаѓаат. ||
     36
     37Првата колона го определува вообичаениот почеток на пребарувањето со составен индекс. Присуството на други колони не значи дека индексот ги содржи сите податоци потребни за прегледот.
    3038
    3139== Верификација ==
     40
    3241{{{
    3342#!sql
    34 SELECT indexname, indexdef
     43SELECT tablename, indexname, indexdef
    3544FROM pg_indexes
    3645WHERE schemaname = 'kbnteam'
    37   AND indexname = 'idx_customer_order_customer_user_id_order_datetime';
     46  AND indexname IN (
     47    'idx_customer_order_customer_user_id_order_datetime',
     48    'idx_customer_company_id'
     49)
     50ORDER BY tablename, indexname;
    3851}}}
    3952
    40 == Очекувано влијание ==
    41 При прашалници по конкретен `customer_user_id` (на пр. проверка на поени за верност при најавување), индексот го трансформира Seq Scan на `customer_order` во Index Scan. `order_datetime DESC` е особено корисен ако апликацијата додатно ги сортира нарачките по датум.
     53Проверката ги прикажува имињата и дефинициите. IF NOT EXISTS спречува повторно креирање под исто име, но не проверува дали постојната дефиниција е еднаква на наведената.
     54
     55== Влијание врз перформансите ==
     56
     57Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.
     58
     59Редоследот по датум може да поддржи пристап до понови нарачки на клиентот, но не ја отстранува потребата од читање на нарачките за COUNT и SUM. Одделен CTE сам по себе не докажува подобри перформанси.
     60
     61== Тестирање на перформанси ==
     62
     63Тест прашалниците за овој преглед се наведени во [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2].
     64
     65=== Резултати пред индексирање ===
     66
     67||= Прашалник ||= Execution Time (ms) ||= План / забелешки ||
     68|| Тест 1: по компанија || ___ || ___ ||
     69|| Тест 2: по ниво || ___ || ___ ||
     70|| Тест 3: по клиент || ___ || ___ ||
     71
     72=== Резултати по индексирање ===
     73
     74||= Прашалник ||= Execution Time (ms) ||= План / забелешки ||
     75|| Тест 1: по компанија || ___ || ___ ||
     76|| Тест 2: по ниво || ___ || ___ ||
     77|| Тест 3: по клиент || ___ || ___ ||