== Оптимизација на прашалници и погледи == == View 1: Детален преглед на сметки == '''Примарен филтер''' за погледот vw_smetki_detali е според klient_id, бидејќи во банкарскиот систем најчесто е потребно да се прикажат сите сметки кои припаѓаат на конкретен клиент. Дополнително, погледот може да се користи и за пребарување според smetka_id или broj_smetka. '''Погледот се користи за''' детален преглед на сметки, при што се прикажуваат број на сметка, тип на сметка, салдо, валута, статус и основни податоци за клиентот. Овој приказ би се користел од страна на клиент или банкарски службеник при проверка на сметките на клиентот. '''Иницијалното време на извршување''' на прашалникот без дополнителен индекс изнесува 27 ms, при што се враќаат 3 редови. Вкупното време е 363 ms, но од тоа 336 ms се однесуваат на fetching, односно преземање и прикажување на резултатите во клиентската алатка. Затоа како релевантно време за базата се зема execution времето од 27 ms. [[Image(view1.png, width=800)]] Од иницијалниот план на извршување може да се забележи дека PostgreSQL користи Parallel Seq Scan на табелата smetka и филтрира според klient_id = 50000. Иако постои простор за оптимизација со индекс на колоната klient_id, времето на извршување е доволно мало и прифатливо за апликацијата. [[Image(view1.1.png, width=800)]] [[Image(view1.2.png, width=800)]] '''Времето за Insert и Update е прифатливо.''' Нема потреба од преуредување на прашалникот. Времето на извршување на операциите останува исто. == View 2: Мониторинг на картички поврзани со клиент == '''Примарен филтер''' за погледот vw_karticki_klienti ќе биде според klient_id, односно според клиентот на кој му припаѓа сметката поврзана со картичката. Дополнително, погледот може да се користи и за пребарување според smetka_id, broj_karticka или статус на картичката. Овој поглед ќе '''се користи за''' мониторинг на картичките на клиентите. Преку него може да се видат бројот на картичката, статусот на картичката, датумот на истекување, типот на картичката, бројот на сметката и основните податоци за сопственикот. Бидејќи картичките се поврзани со клиентот преку сметката, табелата smetka има важна улога во овој поглед. '''Иницијалното време''' за извршување на погледот без дополнителен индекс изнесува 48 ms. Вкупно време од 380 ms, но од тоа 48 ms е реалното execution време, додека 332 ms се однесуваат на fetching, односно преземање и прикажување на резултатите. Затоа како релевантно време за базата се зема execution времето од 48 ms. [[Image(view2.png, width=800)]] Од графичкиот план на извршување може да се забележи дека PostgreSQL користи Full Scan / Seq Scan на табелите karticka и smetka. Во планот се гледа дека табелата karticka има околу 105882 редови, а реално се разгледуваат околу 90000 редови. Исто така се гледа и Full Scan на табелата smetka. Иако постојат full scan операции, времето на извршување е доволно мало и прифатливо. Поради тоа, не е неопходно да се креира посебен индекс само за овој поглед. [[Image(view2.1.png, width=800)]] [[Image(view2.2.png, width=800)]] Нема потреба да се преуредува прашалникот. Времето на извршување на операциите останува исто. == View 3: Кредити и статус на рати == '''Примарен филтер''' за погледот vw_kreditni_rati_status ќе биде според klient_id, односно според клиентот за кој се проверуваат кредитите и нивните рати. Дополнително, погледот може да се користи и за пребарување според kredit_id, доколку е потребно да се прикажат сите рати за конкретен кредит. Овој поглед ќе '''се користи за''' преглед на кредитни рати и нивниот статус. Преку него може да се види кој клиент има кредит, кои рати се поврзани со тој кредит, износот на секоја рата, датумот на валута, статусот на ратата и валутата во која е изразен кредитот. Овој поглед е корисен за проверка дали ратите се платени, неплатени или задоцнети. '''Иницијалното време''' за извршување на погледот без дополнителен индекс изнесува 59 ms. Вкупно време од 444 ms, но од тоа 59 ms е реалното execution време, додека 385 ms се однесуваат на fetching, односно преземање и прикажување на резултатите. Затоа како релевантно време за базата се зема execution времето од 59 ms. [[Image(view3.png, width=800)]] Од графичкиот план на извршување може да се забележи дека PostgreSQL користи Full Scan / Seq Scan на табелите rata_kredit и smetka. Во планот се гледа дека табелата rata_kredit има голем број редови и се скенира за да се пронајдат ратите поврзани со кредитот на клиентот. Исто така се користи и Full Scan на табелата smetka, преку која кредитот се поврзува со клиентот.Иако планот покажува full scan операции, времето на извршување е доволно мало и прифатливо. Поради тоа, не е неопходно да се креира посебен индекс само за овој поглед. [[Image(view3.1.png, width=800)]] [[Image(view3.2.png, width=800)]] Нема потреба да се преуредува прашалникот. Времето на извршување на операциите останува исто. == View 4: Трансакционен лог со имиња на испраќач и примач == '''Примарен филтер''' за погледот vw_transakcii_iminja ќе биде според smetka_isprakjac_id, односно според сметката од која е испратена трансакцијата. Дополнително, погледот може да се користи и со филтер според smetka_primac_id, isprakjac_klient_id, primac_klient_id или датум на трансакција. Овој поглед ќе '''се користи''' како трансакционен лог во банкарскиот систем. Преку него се прикажуваат деталите за трансакцијата, износот, датумот, сметката на испраќачот, сметката на примачот, како и името и презимето на клиентот кој испраќа и клиентот кој прима средства. Овој поглед е важен бидејќи трансакциите се една од најчесто користените функционалности во системот. [[Image(view4.png, width=800)]] '''Иницијалното време''' за извршување на операциите без дополнителен индекс е значително поголемо од претходните погледи. При UPDATE операција врз табелата transakcija, со филтер според smetka_isprakjac_id, времето изнесува околу 1 s 338 ms, односно 1 s 403 ms. Ова време не е прифатливо во споредба со претходните погледи, каде времињата беа во милисекунди. Поради тоа, за овој поглед има потреба од оптимизација. Од графичкиот план на извршување може да се забележи дека најбавната операција е Full Scan / Seq Scan на табелата transakcija. Тоа значи дека PostgreSQL ја пребарува целата табела transakcija за да ги пронајде редовите каде што smetka_isprakjac_id = 10000. Бидејќи трансакциите се табела која може да има многу голем број редови, ваквото целосно скенирање создава забавување. Ова покажува дека колоната smetka_isprakjac_id е добар кандидат за индексирање, бидејќи директно се користи во WHERE условот. Дополнително, бидејќи погледот може да се пребарува и според примачот, потребен е и индекс на smetka_primac_id. [[Image(view4.1.png, width=800)]] [[Image(view4.2.png, width=800)]] По индексирањето, прашалникот враќа 240 редови, а execution времето изнесува 32 ms. Вкупното време прикажано е 404 ms, но од тоа 372 ms се однесуваат на fetching, односно преземање и прикажување на резултатите. Затоа како релевантно време за базата се зема execution времето од 32 ms. [[Image(view4.treto.png, width=800)]] [[Image(view4.4.png, width=800)]] Времето за UPDATE и INSERT операциите по индексирањето исто така е прифатливо. По креирањето на индексите, UPDATE операцијата врз табелата transakcija се извршува за 6 ms и INSERT за 2ms. [[Image(view44.png, width=800)]] == View 5: Централен клиентски адресар == '''Примарен филтер''' за погледот vw_klient_kontakt_info ќе биде според klient_id, односно според клиентот за кој се прикажуваат контакт информации. Дополнително, погледот може да се користи и за пребарување според email, телефонски број или username. Овој поглед ќе '''се користи''' како централен клиентски адресар во банкарскиот систем. Преку него се прикажуваат основните податоци за клиентот, неговото корисничко име, телефонски број, email адреса и физичка адреса. Овој поглед е корисен за вработените во банката кога треба брзо да пристапат до контакт информации за одреден клиент. '''Иницијалното време''' за извршување на погледот без дополнителен индекс изнесува 42 ms. Вкупно време од 390 ms, но од тоа 42 ms е реалното execution време, додека 348 ms се однесуваат на fetching, односно преземање и прикажување на резултатот. Затоа како релевантно време за базата се зема execution времето од 42 ms. Ова време е прифатливо за апликацијата, бидејќи погледот враќа мал број податоци за конкретен клиент. [[Image(view5.png, width=800)]] Од графичкиот план на извршување може да се забележи дека PostgreSQL користи Nested Loop операции и Index Scan врз табелата klient, бидејќи пребарувањето се прави според klient_id. Дополнително, во планот се гледаат Full Scan / Seq Scan операции врз табелите telefon, email и adresa. Иако постојат full scan операции на контактните табели, времето на извршување е доволно мало. Поради тоа, во моменталната состојба нема потреба од задолжително креирање индекси само за овој поглед. [[Image(view5.1.png, width=800)]] [[Image(view5.2.png, width=800)]] Нема потреба да се преуредува прашалникот. Времето на извршување на операциите останува исто. == View 6: Преглед на депозити по клиент == '''Примарен филтер''' за погледот vw_depoziti_klienti ќе биде според klient_id, односно според клиентот за кој се прикажуваат депозитите. Дополнително, погледот може да се користи и за пребарување според smetka_id, бидејќи депозитот е директно поврзан со сметка. Овој поглед ќе '''се користи за''' преглед на депозитите кои ги има конкретен клиент. Преку него се прикажуваат податоци за депозитот, како што се износот на депозитот, каматната стапка, типот на депозитот, бројот на сметката и основните податоци за клиентот. Овој поглед е корисен за банкарски службеник или клиент кога треба да се провери состојбата на депозитите поврзани со одреден клиент. '''Иницијалното време''' за извршување на погледот без дополнителен индекс изнесува 47 ms. Вкупно време од 368 ms, но од тоа 47 ms е реалното execution време, додека 321 ms се однесуваат на fetching, односно преземање и прикажување на резултатите. Затоа како релевантно време за базата се зема execution времето од 47 ms. Ова време е прифатливо за апликацијата, бидејќи погледот враќа мал број податоци и се извршува брзо. [[Image(view6.png, width=800)]] Од графичкиот план на извршување може да се забележи дека PostgreSQL користи Hash Join и Full Scan / Seq Scan на табелата depozit. Исто така, за табелата klient се користи Index Scan, бидејќи пребарувањето е според klient_id.Иако постои Full Scan на табелата depozit, времето на извршување е доволно мало и не создава проблем во моменталната состојба на базата. Поради тоа, нема потреба од задолжително креирање индекс само за овој поглед. [[Image(view6.1.png, width=800)]] [[Image(view6.2.png, width=800)]] Нема потреба да се преуредува прашалникот. Времето на извршување на операциите останува исто. == View 7: Правни договори со потписници == '''Примарен филтер''' за погледот vw_dogovori_detali ќе биде според klient_id, односно според клиентот за кој се прикажуваат договорите. Дополнително, погледот може да се користи и за пребарување според dogovor_id, usluga_id или статус на договорот. Овој поглед ќе '''се користи за''' преглед на правните договори поврзани со клиентите. Преку него се прикажуваат податоци за договорот, како што се наслов, статус, датум на потпишување, клиентот на кој му припаѓа договорот и услугата за која е склучен договорот. Овој поглед е корисен за банкарски службеник кога треба да ги провери договорите на конкретен клиент. '''Иницијалното време''' за извршување на погледот без дополнителен индекс изнесува 17 ms. Вкупно време од 367 ms, но од тоа 17 ms е реалното execution време, додека 350 ms се однесуваат на fetching, односно преземање и прикажување на резултатите. Затоа како релевантно време за базата се зема execution времето од 17 ms. Ова време е многу мало и е целосно прифатливо за апликацијата. [[Image(view7.png, width=800)]] Од графичкиот план на извршување може да се забележи дека PostgreSQL користи Nested Loop операции и Index Scan врз табелата klient, бидејќи пребарувањето се прави според klient_id. Во планот се забележува и Full Scan / Seq Scan на табелата dogovor, но бидејќи бројот на редови што се обработуваат е мал и целокупното execution време е само 17 ms, ова не претставува проблем. Иако постои full scan на табелата dogovor, времето на извршување е доволно мало. Поради тоа, во моменталната состојба нема потреба од задолжително индексирање за овој поглед. [[Image(view7.1.png, width=800)]] [[Image(view7.2.png, width=800)]] Нема потреба да се преуредува прашалникот. Времето на извршување на операциите останува исто.