= Преглед: v_reviews_full = ||= Својство ||= Вредност || || Шема || `kbnteam` || || Категорија || Рецензии || || Поврзани индекси || [wiki:ReviewsFullIndex Индекси за рецензии] || == Опис == Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата. Секој запис го задржува типот на рецензијата и соодветните оценки. Ако една рецензија се однесува и на нарачка и на достава, се прикажуваат двата записа. Еден ред за секој запис во поттипот за нарачка или достава. Рецензиите без поттип не се прикажуваат. Компанијата и доставувачот кај рецензија за достава можат да бидат NULL. Прегледот нема колона rest_id. Филтрирање по ресторан бара дополнително поврзување со податоците за нарачката или доставувачот. == Зависности == ||= Табела / преглед ||= Употреба || || `kbnteam.review` || Заеднички податоци за рецензиите. || || `kbnteam.order_review` || Рецензии за нарачки и оценки за храна и ресторан. || || `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. || || `kbnteam.api_user` || Лични и контактни податоци за корисниците. || || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || || `kbnteam.company` || Податоци за компаниите. || || `kbnteam.delivery_review` || Рецензии за достави и оценки за доставувач и брзина. || || `kbnteam.delivery` || Достави, датуми, забелешки и назначени доставувачи. || == Излезни колони == ||= Колона ||= Опис ||= Извор за order ||= Извор за delivery || || `review_id` || Идентификатор на рецензијата. || `review.review_id` || `review.review_id` || || `review_type` || Тип на рецензијата: order или delivery. || `'order'::text` || `'delivery'::text` || || `review_created_at` || Датум и време на рецензијата. || `review.review_created_at` || `review.review_created_at` || || `review_rating` || Општа оценка од 1 до 5. || `review.review_rating` || `review.review_rating` || || `review_comment` || Коментар за рецензијата. || `review.review_comment` || `review.review_comment` || || `order_id` || Идентификатор на клиентската нарачка. || `order_review.order_id` || `NULL::integer` || || `delivery_id` || Идентификатор на доставата. || `NULL::integer` || `delivery_review.delivery_id` || || `company_id` || Идентификатор на компанијата. || `company_order.company_id` || `company_order.company_id` || || `company_name` || Назив на компанијата. || `company.company_name` || `company.company_name` || || `customer_user_id` || Идентификатор на клиентот. || `api_user.user_id` || `NULL::integer` || || `customer_first_name` || Име на клиентот. || `api_user.user_first_name` || `NULL::varchar(255)` || || `customer_last_name` || Презиме на клиентот. || `api_user.user_last_name` || `NULL::varchar(255)` || || `driver_user_id` || Идентификатор на доставувачот. || `NULL::integer` || `api_user.user_id` || || `driver_first_name` || Име на доставувачот. || `NULL::varchar(255)` || `api_user.user_first_name` || || `driver_last_name` || Презиме на доставувачот. || `NULL::varchar(255)` || `api_user.user_last_name` || || `order_review_food_rating` || Оценка за храната од 1 до 5. || `order_review.order_review_food_rating` || `NULL::integer` || || `order_review_res_rating` || Оценка за ресторанот од 1 до 5. || `order_review.order_review_res_rating` || `NULL::integer` || || `del_review_courier_rating` || Оценка за доставувачот од 1 до 5. || `NULL::integer` || `delivery_review.del_review_courier_rating` || || `del_review_speed_rating` || Оценка за брзината од 1 до 5. || `NULL::integer` || `delivery_review.del_review_speed_rating` || == SQL дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_reviews_full AS SELECT r.review_id, 'order'::text AS review_type, r.review_created_at, r.review_rating, r.review_comment, orv.order_id, NULL::integer AS delivery_id, co.company_id, cmp.company_name, au.user_id AS customer_user_id, au.user_first_name AS customer_first_name, au.user_last_name AS customer_last_name, NULL::integer AS driver_user_id, NULL::varchar(255) AS driver_first_name, NULL::varchar(255) AS driver_last_name, orv.order_review_food_rating, orv.order_review_res_rating, NULL::integer AS del_review_courier_rating, NULL::integer AS del_review_speed_rating FROM kbnteam.review r JOIN kbnteam.order_review orv ON orv.review_id = r.review_id JOIN kbnteam.customer_order o ON o.order_id = orv.order_id JOIN kbnteam.api_user au ON au.user_id = o.customer_user_id JOIN kbnteam.company_order co ON co.comp_order_id = o.comp_order_id JOIN kbnteam.company cmp ON cmp.company_id = co.company_id UNION ALL SELECT r.review_id, 'delivery'::text AS review_type, r.review_created_at, r.review_rating, r.review_comment, NULL::integer AS order_id, drvrev.delivery_id, co.company_id, cmp.company_name, NULL::integer AS customer_user_id, NULL::varchar(255) AS customer_first_name, NULL::varchar(255) AS customer_last_name, du.user_id AS driver_user_id, du.user_first_name AS driver_first_name, du.user_last_name AS driver_last_name, NULL::integer AS order_review_food_rating, NULL::integer AS order_review_res_rating, drvrev.del_review_courier_rating, drvrev.del_review_speed_rating FROM kbnteam.review r JOIN kbnteam.delivery_review drvrev ON drvrev.review_id = r.review_id JOIN kbnteam.delivery d ON d.delivery_id = drvrev.delivery_id LEFT JOIN kbnteam.api_user du ON du.user_id = d.driver_user_id LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id; }}} == Тестирање на перформанси == „Пред индексирање“ и „по индексирање“ ги означуваат групите наведени како „без индекси“ и „со индекси“ во евиденцијата. Точниот сет присутни индекси во секоја група не е евидентиран; „без индекси“ не потврдува отсуство на индекси од примарни и уникатни клучеви. Наведените времиња се клиентски мерења од DBeaver, а не серверските Planning Time и Execution Time од EXPLAIN ANALYZE. Нема приложени планови, типови на скенирање или податоци за баферите. Вредностите се во милисекунди (ms). === Измерен прашалник === {{{ #!sql SELECT * FROM kbnteam.v_reviews_full WHERE customer_user_id = 500000; }}} === Резултати пред индексирање === ||= Метрика ||= Измерен резултат || || Клиентско време (ms) || 544 || || Приказ на мерењето || Време прикажано со резултатот во DBeaver || || Прикажани / преземени редови || 1 || || Planning Time / Execution Time од EXPLAIN || Не се измерени || || План, тип на скенирање и бафери || Не се приложени || === Дополнителни и заеднички индекси === `order_review(review_id)`, `order_review(order_id)`, `delivery_review(review_id)` и `delivery_review(delivery_id)` имаат уникатни индекси. `company_order(delivery_id)` исто така е уникатен. Останатите потребни индекси се споделени со нарачките и доставите. ||= Индекс ||= Табела и колони ||= Намена || || `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. || || `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. || || `idx_delivery_driver_user_id_delivery_date` || `delivery(driver_user_id, delivery_date)` || Пронаоѓање достави по доставувач; во прегледите за нарачки и достави и по датум. || || `idx_customer_order_customer_user_id_order_datetime` || `customer_order(customer_user_id, order_datetime DESC)` || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. || {{{ #!sql CREATE INDEX IF NOT EXISTS idx_company_order_company_id ON kbnteam.company_order (company_id); CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id ON kbnteam.customer_order (comp_order_id); CREATE INDEX IF NOT EXISTS idx_delivery_driver_user_id_delivery_date ON kbnteam.delivery (driver_user_id, delivery_date); CREATE INDEX IF NOT EXISTS idx_customer_order_customer_user_id_order_datetime ON kbnteam.customer_order (customer_user_id, order_datetime DESC); }}} === Проверка на индексите === {{{ #!sql SELECT tablename, indexname, indexdef FROM pg_indexes WHERE schemaname = 'kbnteam' AND indexname IN ( 'idx_company_order_company_id', 'idx_customer_order_comp_order_id', 'idx_delivery_driver_user_id_delivery_date', 'idx_customer_order_customer_user_id_order_datetime' ) ORDER BY tablename, indexname; }}} === Резултати по индексирање === ||= Метрика ||= Измерен резултат || || Клиентско време (ms) || 55 || || Приказ на мерењето || Време прикажано со резултатот во DBeaver || || Прикажани / преземени редови || 1 || || Planning Time / Execution Time од EXPLAIN || Не се измерени || || План, тип на скенирање и бафери || Не се приложени || === Анализа на резултатите === ||= Метрика ||= Пред ||= По ||= Промена на времето || || Клиентско време (ms) || 544 || 55 || -89,9% || Времето е пократко за 489 ms (89,9%), приближно 9,9 пати. Ова е забележан резултат за конкретниот клиент. Без план на извршување не може да се утврди кој индекс придонел за разликата. Користена е точната прикажана вредност 544 ms. Промената се пресметува како 100 × (време по - време пред) / време пред. Негативна вредност значи пократко време, а позитивна подолго време. Процентот ја опишува разликата меѓу прикажаните вредности. Ова се поединечни набљудувања. Не се евидентирани контролирани повторувања, исти услови за кеширање и оптоварување или точните дефиниции на присутните индекси. Затоа промената на времето не е доказ дека индексите се единствената причина. Не се приложени мерења за INSERT, UPDATE и DELETE. === Дополнително тестирање - сè уште неизмерено === Следниот прашалник служи за ново мерење на серверскиот план со истиот филтер. Неговите резултати не се пополнети со клиентските времиња наведени погоре. За споредба се задржуваат исти податоци и поставки, се евидентираат присутните индекси, се ажурираат статистиките и се прават повеќе повторувања во двете состојби. Се споредуваат медијаната на времињата и плановите. {{{ #!sql BEGIN READ ONLY; SET LOCAL statement_timeout = '60s'; EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_reviews_full WHERE customer_user_id = 500000; ROLLBACK; }}} ||= Метрика за дополнителното тестирање ||= Пред ||= По || || Planning Time (ms) || Не е измерено || Не е измерено || || Execution Time (ms) || Не е измерено || Не е измерено || || Тип на скенирање по табела || Не е евидентиран || Не е евидентиран || || Shared Hit Blocks / Shared Read Blocks || Не се измерени || Не се измерени ||