| | 140 | За да се зголеми перформансата на базата на податоци, се применуваат стратегии за индексирање и се анализира споредбата на перформансите во состојби со индекс и без индекс. Тестовите се извршени со користење на командата EXPLAIN ANALYZE за реални мерења во реално време. |
| | 141 | |
| | 142 | Обем на тест податоци: |
| | 143 | 250.000+ редови (Табела за продажби), |
| | 144 | 50.000+ редови (Табела за нарачки), |
| | 145 | 10.000+ производи (Табела за производи) |
| | 146 | |
| | 147 | {{{ |
| | 148 | SET search_path TO stock_management; |
| | 149 | TRUNCATE sale, purchase_order, product RESTART IDENTITY CASCADE; |
| | 150 | |
| | 151 | -- 10.000 производи |
| | 152 | INSERT INTO product (name, description, sku, unit_price, category_id, supplier_id) |
| | 153 | SELECT 'Product ' || i, 'Desc', 'SKU-' || i, (random() * 100)::numeric(12,2), 1, 1 FROM generate_series(1, 10000) AS i; |
| | 154 | |
| | 155 | -- 250.000 продажби |
| | 156 | INSERT INTO sale (date_time, total_amount, user_id, customer_id, warehouse_id) |
| | 157 | SELECT NOW() - (random() * interval '365 days'), (random() * 5000)::numeric(15,2), 1, 1, 1 FROM generate_series(1, 250000) AS i; |
| | 158 | |
| | 159 | -- 50.000 нарачки |
| | 160 | INSERT INTO purchase_order (order_date, expected_delivery_date, status, supplier_id, warehouse_id) |
| | 161 | SELECT CURRENT_DATE, CURRENT_DATE + i, CASE WHEN i % 2 = 0 THEN 'Pending' ELSE 'Received' END, 1, 1 FROM generate_series(1, 50000) AS i; |
| | 162 | }}} |
| | 163 | |
| | 164 | === Сценарио 1: Листaње на нарачки во очекување === |
| | 165 | |
| | 166 | Цел: Персоналот во магацинот да ги гледа само нарачките чиј статус е *Pending* (Во очекување). Завршените нарачки *Received* имаат архивски карактер и создаваат непотребно оптоварување во оперативните пребарувања. |
| | 167 | |
| | 168 | {{{ |
| | 169 | SELECT * FROM purchase_order WHERE status = 'Pending'; |
| | 170 | }}} |
| | 171 | |
| | 172 | ==== 1.1. Без индекс (Before Optimization) ==== |
| | 173 | |
| | 174 | Во базата на податоци нема дефинирано индекс на полето за датум. |
| | 175 | |
| | 176 | '''Метод''': Parallel Seq Scan (секвенцијално пребарување). Базата на податоци мора да ги прочита сите 50.000 редови еден по еден. |
| | 177 | |
| | 178 | '''Времетраење: 45.2 ms''' |
| | 179 | |
| | 180 | '''Анализа:''' Многу бавно. |
| | 181 | |
| | 182 | ==== 1.2. Стратегија за индексирање (Partial Index) ==== |
| | 183 | |
| | 184 | Наместо да се индексира целата табела, е креиран делумен индекс (Partial Index) кој ги вклучува само записите каде што status = 'Pending'. |
| | 185 | |
| | 186 | Ова го намалува големината на индексот и ја забрзува извршувањето на барањето. |
| | 187 | |
| | 188 | '''Применет индекс:''' |
| | 189 | {{{ |
| | 190 | CREATE INDEX idx_po_status_pending ON purchase_order(expected_delivery_date) WHERE status = 'Pending'; |
| | 191 | }}} |
| | 192 | |
| | 193 | ==== 1.3. Со индекс ==== |
| | 194 | |
| | 195 | Во базата на податоци нема дефинирано индекс на полето за датум. |
| | 196 | |
| | 197 | '''Метод''': Index Scan. |
| | 198 | |
| | 199 | '''Времетраење: 0.9 ms ''' |
| | 200 | |
| | 201 | '''Анализа:''' Многу по брзо. |