Changes between Version 3 and Version 4 of Indexes


Ignore:
Timestamp:
09/11/25 16:47:57 (8 days ago)
Author:
222004
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Indexes

    v3 v4  
    1 == **Индекси и анализа на перформанси**\\
    2 \\
     1== **Индекси и анализа на перформанси** 
    32
    4 Овој извештај ги опфаќа најважните индекси што во реална примена ќе придонесат на подобри перформанси во SynergyMed. 
    5 Се фокусира на најфреквентните пребарувања, join-операции и критични бизнис сценарија.
     3---- 
    64
    7 Со овие индекси: 
    8  * Покриваме најфреквентни пребарувања (`username`, `e_mail`, `embg`, `medicine_name`) 
    9  * Подобрена е временската анализа (`payment_date`, `order_date`, `last_changed`) 
    10  * Финансиски извештаи се оптимизирани (`status + payment_date`) 
    11  * JOIN операциите се побрзи (`payment_id`, `manufacturer_id`, `branded_medicine_id`) 
    12  * Клучни здравствени функции (рецепти, интеракции на лекови) се извршуваат ефикасно   
     5Тука ќе ги опфатиме индексите што не се автоматски покриени со PK/UK и во реална примена би можеле да придонесат за подобри перформанси во SynergyMed.// 
     6Фокусот е на најфреквентните пребарувања, JOIN операции и критични бизнис сценарија.// 
    137
     8Со овие индекси:// 
     9- Покриваме најфреквентни пребарувања (username, e_mail, embg, medicine_name).// 
     10- Подобрена е временската анализа (payment_date, order_date, last_changed).// 
     11- Финансиски извештаи се оптимизирани (status + payment_date).// 
     12- JOIN операциите се побрзи (FK кон payment_id, manufacturer_id, branded_medicine_id).// 
     13- Клучни здравствени функции (рецепти, интеракции на лекови) се извршуваат ефикасно.// 
    1414
    15 ----
     15---- 
    1616
     17=== **Сценарио 1: Финансиски извештаи**// 
     18Овие анализи се вршат преку филтрирање на **payment.status** и **payment.payment_date**, како и преку JOIN помеѓу **clientorder** и **payment**.// 
    1719
    18 == 1. Users (login и профили) ==
     20**Оптимизација:**// 
     21Со композитен индекс (**status**, **payment_date**) и индекс врз **clientorder(payment_id)**, пребарувањето е значително побрзо, а ORDER BY операцијата често може да се изврши директно преку индекс.// 
    1922
    20 **Сценарио:** 
    21 Корисниците најчесто се бараат по `username` и `e_mail` за login и проверка на профили. 
    22 
    23 **Индекси:** 
    2423{{{
    2524
    26 CREATE INDEX IF NOT EXISTS idx_users_username ON synergymed.users(username);
    27 CREATE INDEX IF NOT EXISTS idx_users_email ON synergymed.users(e_mail);
     25CREATE INDEX IF NOT EXISTS idx_payment_status_date
     26  ON synergymed.payment(status, payment_date);
     27CREATE INDEX IF NOT EXISTS idx_clientorder_payment_id
     28  ON synergymed.clientorder(payment_id);
     29
     30}}} 
     31
     32---- 
     33
     34=== **Сценарио 2: Анализа на залихи по аптека**// 
     35
     36**Оптимизација:**// 
     37- Индекс врз branded_medicine_id за брзо групирање и агрегација.// 
     38- Индекс врз last_changed за побрзи временски анализи.// 
     39
     40{{{
     41
     42CREATE INDEX IF NOT EXISTS idx_inventorybm_bmid
     43  ON synergymed.inventory_brandedmedicine(branded_medicine_id);
     44CREATE INDEX IF NOT EXISTS idx_inventorybm_last_changed
     45  ON synergymed.inventory_brandedmedicine(last_changed);
     46
     47}}} 
     48
     49---- 
     50
     51=== **Сценарио 3: Пребарување по пациенти и рецепти**// 
     52Лекарите пребаруваат рецепти според пациент (**client_id**) или според лек (**medicine_id**). Дополнително, се проверува важноста (**valid_to**) на рецептите за да се открие дали се активни.// 
     53
     54**Оптимизација:**// 
     55- Индекс врз prescription(client_id)// 
     56- Индекс врз prescription(medicine_id)// 
     57- Индекс врз prescription(valid_to) за да се филтрираат активни рецепти// 
     58
     59{{{
     60
     61CREATE INDEX IF NOT EXISTS idx_prescription_client
     62  ON synergymed.prescription(client_id);
     63CREATE INDEX IF NOT EXISTS idx_prescription_medicine
     64  ON synergymed.prescription(medicine_id);
     65CREATE INDEX IF NOT EXISTS idx_prescription_valid_to
     66  ON synergymed.prescription(valid_to);
     67
     68}}} 
     69
     70---- 
     71
     72=== **Сценарио 4: Проверка на интеракции на лекови**// 
     73Со цел проверка дали ново препишан лек влегува во интеракција со постоечките лекови кај пациент, често се врши пребарување по комбинација од **medicine_id_1** и **medicine_id_2**, како и по нивната **severity**.// 
     74
     75**Оптимизација:**// 
     76- Композитен индекс на (medicine_id_1, medicine_id_2)// 
     77- Индекс врз severity за побрзи филтрирања// 
     78
     79{{{
     80
     81CREATE INDEX IF NOT EXISTS idx_mi_meds
     82  ON synergymed.medicineinteraction(medicine_id_1, medicine_id_2);
     83CREATE INDEX IF NOT EXISTS idx_mi_severity
     84  ON synergymed.medicineinteraction(severity);
     85
     86}}} 
     87
     88---- 
     89
     90== **Тестирање со EXPLAIN ANALYZE**// 
     91
     92**Пример за тестирање на извештај од сценарио 2:**// 
     93{{{
     94
     95EXPLAIN (ANALYZE, BUFFERS)
     96SELECT c.company_name AS pharmacy,
     97       bm.name AS branded_medicine,
     98       mc.company_name AS manufacturer,
     99       SUM(ibm.quantity) AS total_stock,
     100       MAX(ibm.last_changed) AS last_update
     101FROM synergymed.inventory_brandedmedicine ibm
     102JOIN synergymed.inventory i ON ibm.inventory_id = i.id
     103JOIN synergymed.facility f ON i.id = f.id
     104JOIN synergymed.pharmacy ph ON f.company_id = ph.company_id
     105JOIN synergymed.company c ON ph.company_id = c.id         
     106JOIN synergymed.brandedmedicine bm ON ibm.branded_medicine_id = bm.id
     107JOIN synergymed.manufacturer m ON bm.manufacturer_id = m.company_id
     108JOIN synergymed.company mc ON m.company_id = mc.id
     109GROUP BY c.company_name, bm.name, mc.company_name
     110HAVING SUM(ibm.quantity) < 100
     111ORDER BY total_stock ASC, last_update DESC
     112LIMIT 20;
     113
     114}}} 
     115
     116**Пример за тестирање извештај од сценарио 3:**//
     117{{{
     118
     119EXPLAIN (ANALYZE, BUFFERS)
     120SELECT u.username,
     121       p.issued_at,
     122       p.valid_to,
     123       m.name AS medicine_name
     124FROM synergymed.prescription p
     125JOIN synergymed.users u ON p.embg = u.e_mail  -- пример мапирање, зависи од FK
     126JOIN synergymed.medicine m ON p.medicine_id = m.id
     127WHERE p.valid_to >= CURRENT_DATE
     128  AND u.username ILIKE '%ivan%'
     129ORDER BY p.valid_to DESC;
     130
     131}}}
     132
     133**Пример за тестирање извештај од сценарио 4:**//
     134{{{
     135
     136EXPLAIN (ANALYZE, BUFFERS)
     137SELECT m1.medicine_name AS medicine_a,
     138       m2.medicine_name AS medicine_b,
     139       mi.severity,
     140       mi.type,
     141       mi.description
     142FROM synergymed.medicineinteraction mi
     143JOIN synergymed.medicine m1 ON mi.medicine_id_1 = m1.id
     144JOIN synergymed.medicine m2 ON mi.medicine_id_2 = m2.id
     145WHERE mi.severity IN ('умерена', 'висока')
     146ORDER BY mi.severity DESC, m1.medicine_name, m2.medicine_name
     147LIMIT 50;
    28148
    29149}}}
    30150
    31151----
     152== **Споредба на извршување на извештај за сценарио 2, 3 и 4 со и без индекси**//
    32153
    33 == 2. ClientOrder и Payment (нарачки и плаќања) ==
    34154
    35 **Сценарио:** 
    36 Финансиски извештаи и анализа на нарачки секогаш користат `status` и `payment_date`. 
    37 JOIN е преку `payment_id`. 
    38 
    39 **Индекси:** 
    40 {{{
    41 
    42 -- Брзо пребарување по статус на плаќања
    43 CREATE INDEX IF NOT EXISTS idx_payment_status ON synergymed.payment(status);
    44 
    45 -- Временска анализа на плаќања
    46 CREATE INDEX IF NOT EXISTS idx_payment_date ON synergymed.payment(payment_date);
    47 
    48 -- JOIN ClientOrder → Payment
    49 CREATE INDEX IF NOT EXISTS idx_clientorder_payment_id ON synergymed.clientorder(payment_id);
    50 
    51 }}}
    52 
    53 ----
    54 
    55 == 3. Medicine и BrandedMedicine (лекови) ==
    56 
    57 **Сценарио:** 
    58 Аптекарите и клиентите пребаруваат по `medicine_name`, `active_ingredient` или по `manufacturer_id`. 
    59 
    60 **Индекси:** 
    61 {{{
    62 
    63 CREATE INDEX IF NOT EXISTS idx_medicine_name ON synergymed.medicine(medicine_name);
    64 CREATE INDEX IF NOT EXISTS idx_medicine_active_ingredient ON synergymed.medicine(active_ingredient);
    65 
    66 CREATE INDEX IF NOT EXISTS idx_brandedmedicine_manufacturer_id ON synergymed.brandedmedicine(manufacturer_id);
    67 }}}
    68 
    69 ----
    70 
    71 == 4. Inventory_BrandedMedicine (залихи) ==
    72 
    73 **Сценарио:** 
    74 Клучна е проверката на количина по `branded_medicine_id` и следење на промени со `last_changed`. 
    75 
    76 **Индекси:** 
    77 {{{
    78 
    79 CREATE INDEX IF NOT EXISTS idx_inventorybm_bmid ON synergymed.inventory_brandedmedicine(branded_medicine_id);
    80 CREATE INDEX IF NOT EXISTS idx_inventorybm_last_changed ON synergymed.inventory_brandedmedicine(last_changed);
    81 
    82 }}}
    83 
    84 ----
    85 
    86 == 5. SupplyOrder (набавки) ==
    87 
    88 **Сценарио:** 
    89 Фармациите и дистрибутерите следат `status` и `order_date` за активни нарачки. 
    90 
    91 **Индекси:** 
    92 {{{
    93 
    94 CREATE INDEX IF NOT EXISTS idx_supplyorder_status ON synergymed.supplyorder(status);
    95 CREATE INDEX IF NOT EXISTS idx_supplyorder_order_date ON synergymed.supplyorder(order_date);
    96 
    97 }}}
    98 
    99 ----
    100 
    101 == 6. Prescription и SensitiveClientData (пациенти и рецепти) ==
    102 
    103 **Сценарио:** 
    104 Пребарување по `embg` (пациент), по `client_id` и `medicine_id` кај рецепти. 
    105 
    106 **Индекси:** 
    107 
    108 {{{
    109 
    110 CREATE INDEX IF NOT EXISTS idx_sensitiveclientdata_embg ON synergymed.sensitiveclientdata(embg);
    111 
    112 CREATE INDEX IF NOT EXISTS idx_prescription_client_id ON synergymed.prescription(client_id);
    113 CREATE INDEX IF NOT EXISTS idx_prescription_medicine_id ON synergymed.prescription(medicine_id);
    114 
    115 }}}
    116 
    117 ----
    118 
    119 == 7. MedicineInteraction (интеракции на лекови) ==
    120 
    121 **Сценарио:** 
    122 Аптекарите проверуваат комбинации на два лека и интензитет на нивната реакција. 
    123 
    124 **Индекси:** 
    125 {{{
    126 
    127 CREATE INDEX IF NOT EXISTS idx_mi_medicine2 ON synergymed.medicineinteraction(medicine_id_2);
    128 CREATE INDEX IF NOT EXISTS idx_mi_severity ON synergymed.medicineinteraction(severity);
    129 
    130 }}}
    131 
    132 ----