= Индекси и оптимизација на прашалници = ---- **Членови на тим**: * Никола Маркоски (235013) * Шенол Фејзоски (231075) == View1: Просечна оценка по продавач (vw_avg_rating_per_vendor) == '''1.''' Примарен филтер за погледот `vw_avg_rating_per_vendor` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на просечната оценка на секој продавач врз основа на рецензии од проекти. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното време за извршување на погледот е '''1m 24s 217ms'''. Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. [[Image(Average_Rating_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Average_Rating_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' По креирање на индексите: {{{ CREATE INDEX idx_project_contract_id ON Project (contract_id); CREATE INDEX idx_cvc_client_id ON Client_Vendor_Contract (client_id); CREATE INDEX idx_cvc_vendor_id ON Client_Vendor_Contract (vendor_id); }}} Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View2: Вкупен буџет по клиент (vw_budget_per_client) == '''1.''' Примарен филтер за погледот `vw_budget_per_client` ќе биде според неговото id (client_id на клиентот). '''2.''' Примарен случај на употреба ќе е преглед на вкупниот буџет потрошен по клиент низ сите проекти и договори. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното време за извршување на погледот е '''320ms'''. Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. [[Image(Budget_per_Client_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Budget_per_Client_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View3: Вкупен буџет по продавач (vw_budget_per_vendor) == '''1.''' Примарен филтер за погледот `vw_budget_per_vendor` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на вкупниот буџет потрошен по продавач низ сите проекти и договори. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното време за извршување на погледот е '''319ms'''. Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. [[Image(Budget_per_Vendor_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Budget_per_Vendor_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View4: Клиенти по индустрија (vw_clients_per_industry) == '''1.''' Примарен филтер за погледот `vw_clients_per_industry` ќе биде според неговото id (industry_id на индустријата). '''2.''' Примарен случај на употреба ќе е преглед на сите клиенти кои припаѓаат на одредена индустрија. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното време за извршување на погледот е '''94ms'''. Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. [[Image(Clients_per_Industry_Execution.png, 800px)]] '''4.''' Најбавната операција е full scan на табелата: * `Client` - 500 cost [[Image(Clients_per_Industry_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Client_Insert_Pre_Index.png, 800px)]] [[Image(Client_Update_Pre_Index.png, 800px)]] '''5.''' По креирање на индексот: {{{ CREATE INDEX idx_client_industry_id ON Client (industry_id); }}} Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Client_Insert_Post_Index.png, 800px)]] [[Image(Client_Update_Post_Index.png, 800px)]] ---- == View5: Договори по клиент (vw_contracts_per_client) == '''1.''' Примарен филтер за погледот `vw_contracts_per_client` ќе биде според неговото id (client_id на клиентот). '''2.''' Примарен случај на употреба ќе е преглед на сите активни и историски договори за одреден клиент. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното време за извршување на погледот е '''399ms'''. Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. [[Image(Contracts_per_Client_Execution.png, 800px)]] '''4.''' Најбавната операција е full scan на табелата: * `Client_Vendor_Contract` - 7k cost [[Image(Contracts_per_Client_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View6: Договори по продавач (vw_contracts_per_vendor) == '''1.''' Примарен филтер за погледот `vw_contracts_per_vendor` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на сите активни и историски договори за одреден продавач. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''5s 887ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Contracts_per_Vendor_Execution.png, 800px)]] '''4.''' Најбавната операција е full scan на табелата: * `Client_Vendor_Contract` - 7k cost [[Image(Contracts_per_Vendor_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View7: Број на проекти по статус по клиент (vw_project_count_by_status_per_client) == '''1.''' Примарен филтер за погледот `vw_project_count_by_status_per_client` ќе биде според неговото id (client_id на клиентот). '''2.''' Примарен случај на употреба ќе е преглед на бројот на проекти групирани по статус за одреден клиент. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''317ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Project_Count_By_Status_Per_Client_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Project_Count_By_Status_Per_Client_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View8: Број на проекти по статус по продавач (vw_project_count_by_status_per_vendor) == '''1.''' Примарен филтер за погледот `vw_project_count_by_status_per_vendor` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на бројот на проекти групирани по статус за одреден продавач. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''317ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Project_Count_By_Status_Per_Vendor_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Project_Count_By_Status_Per_Vendor_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View9: Проекти по клиент (vw_projects_per_client) == '''1.''' Примарен филтер за погледот `vw_projects_per_client` ќе биде според неговото id (client_id на клиентот). '''2.''' Примарен случај на употреба ќе е преглед на сите проекти поврзани со одреден клиент. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''626ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Projects_per_Client_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Projects_per_Client_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View10: Проекти по продавач (vw_projects_per_vendor) == '''1.''' Примарен филтер за погледот `vw_projects_per_vendor` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на сите проекти поврзани со одреден продавач. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''445ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Projects_per_Vendor_Execution.png, 800px)]] '''4.''' Најбавните операции се full scan на табелите: * `Project` - 26k cost * `Client_Vendor_Contract` - 7k cost [[Image(Projects_per_Vendor_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Project_Insert_Pre_Index.png, 800px)]] [[Image(Project_Update_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Pre_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Pre_Index.png, 800px)]] '''5.''' Индексите креирани во View1 ги покриваат и овие табели. Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Project_Insert_Post_Index.png, 800px)]] [[Image(Project_Update_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Insert_Post_Index.png, 800px)]] [[Image(Client_Vendor_Contract_Update_Post_Index.png, 800px)]] ---- == View11: Нерешени тикети за спорови (vw_unresolved_dispute_tickets) == '''1.''' Примарен филтер за погледот `vw_unresolved_dispute_tickets` ќе биде според project_id на проектот или assigned_management_user_id на корисникот. '''2.''' Примарен случај на употреба ќе е преглед на сите активни нерешени тикети за спорови доделени на одреден менаџмент корисник или поврзани со одреден проект. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''731ms'''. Ова не е прифатливо времe за апликацијата па затоа пристапуваме кон индексирање. [[Image(Unresolved_Dispute_Tickets_Execution.png, 800px)]] '''4.''' Најбавната операција е full scan на табелата: * `Dispute_Ticket` - 9k cost [[Image(Unresolved_Dispute_Tickets_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Dispute_Ticket_Insert_Pre_Index.png, 800px)]] [[Image(Dispute_Ticket_Update_Pre_Index.png, 800px)]] '''5.''' По креирање на индексите: {{{ CREATE INDEX idx_dispute_ticket_review_id ON Dispute_Ticket (review_id); CREATE INDEX idx_dispute_ticket_is_resolved ON Dispute_Ticket (is_resolved); }}} Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Dispute_Ticket_Insert_Post_Index.png, 800px)]] [[Image(Dispute_Ticket_Update_Post_Index.png, 800px)]] ---- == View12: Претплати на продавачи (vw_vendor_subscriptions) == '''1.''' Примарен филтер за погледот `vw_vendor_subscriptions` ќе биде според неговото id (vendor_id на продавачот). '''2.''' Примарен случај на употреба ќе е преглед на активните и историските претплати за одреден продавач. За овој поглед ни се важни перформансите, бидејќи без него се губи време при извршување. '''3.''' Иницијалното время за извршување на погледот е '''37ms'''. Ова е прифатливо времe за апликацијата. [[Image(Vendor_Subscriptions_Execution.png, 800px)]] '''4.''' Најбавната операција е full scan на табелата: * `Vendor_Subscription` - 180 cost Иако времето е прифатливо, сепак пристапуваме кон индексирање за дополнителна оптимизација. [[Image(Vendor_Subscriptions_Scan.png, 800px)]] Времето изминато во извршување на операциите insert и update пред индексирање изнесува: [[Image(Vendor_Subscription_Insert_Pre_Index.png, 800px)]] [[Image(Vendor_Subscription_Update_Pre_Index.png, 800px)]] '''5.''' По креирање на индексите: {{{ CREATE INDEX idx_vendorsub_vendor_id ON Vendor_Subscription (vendor_id); CREATE INDEX idx_vendorsub_tier_id ON Vendor_Subscription (tier_id); }}} Времето изминато во извршување на query-то со индекси изнесува: ''[SCREENSHOT: SELECT извршување по индексирање]'' ''[SCREENSHOT: Explain Plan по индексирање]'' '''6.''' Времето изминато во извршување на операциите insert и update по индексирање изнесува: [[Image(Vendor_Subscription_Insert_Post_Index.png, 800px)]] [[Image(Vendor_Subscription_Update_Post_Index.png, 800px)]]