= Преглед: v_reviews_full = ||= Датотека ||= `views/03_reviews_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Прегледи || ||= Поврзани индекси ||= `indexes/v_reviews_full_index.sql` || == Опис == Обединет извештај за прегледи на нарачки и прегледи на достави преку `UNION ALL`. Двата подтипа имаат различни колони — полињата кои не постојат за еден тип се пополнуваат со `NULL`. Прегледот е погоден за пrikажување на оценки по ресторан, по возач или по купувач во веб апликацијата. == Зависности == ||= Табела ||= Тип на употреба ||= Дел || || `kbnteam.review` || Главна табела || И двата дела || || `kbnteam.order_review` || JOIN — преглед на нарачка || Прв дел (order) || || `kbnteam.customer_order` || JOIN — нарачката || Прв дел || || `kbnteam.customer` || JOIN — купувач || Прв дел || || `kbnteam.api_user` || JOIN — детали за купувач/возач || И двата дела || || `kbnteam.company_order` || JOIN — компаниска нарачка || И двата дела || || `kbnteam.company` || JOIN — компанија || И двата дела || || `kbnteam.delivery_review` || JOIN — преглед на достава || Втор дел (delivery) || || `kbnteam.delivery` || JOIN — достава || Втор дел || || `kbnteam.driver` || LEFT JOIN — возач || Втор дел || == Излезни колони == ||= Колона ||= Опис ||= Нарачка ||= Достава || || `review_id` || ID на прегледот || ✓ || ✓ || || `review_type` || `'order'` или `'delivery'` || `'order'` || `'delivery'` || || `review_created_at` || Датум на прегледот || ✓ || ✓ || || `review_rating` || Општа оценка (1-5) || ✓ || ✓ || || `review_comment` || Коментар || ✓ || ✓ || || `order_id` || ID на нарачката || ✓ || NULL || || `delivery_id` || ID на доставата || NULL || ✓ || || `company_id` || ID на компанијата || ✓ || ✓ || || `company_name` || Назив на компанијата || ✓ || ✓ || || `customer_user_id` || ID на купувачот || ✓ || NULL || || `driver_user_id` || ID на возачот || NULL || ✓ || || `order_review_food_rating` || Оценка за храна (1-5) || ✓ || NULL || || `order_review_res_rating` || Оценка за ресторан (1-5) || ✓ || NULL || || `del_review_courier_rating` || Оценка за курир (1-5) || NULL || ✓ || || `del_review_speed_rating` || Оценка за брзина (1-5) || NULL || ✓ || == 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.customer cu ON cu.user_id = o.customer_user_id JOIN kbnteam.api_user au ON au.user_id = cu.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.driver drv ON drv.user_id = d.driver_user_id LEFT JOIN kbnteam.api_user du ON du.user_id = drv.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; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по тип на преглед EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_reviews_full WHERE review_type = 'order'; -- Тест 2: по компаниска нарачка EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_reviews_full WHERE company_id = 1; }}} === Резултати пред индексирање === ||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || customer_order scan || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Применети индекси === {{{ #!sql -- indexes/v_reviews_full_index.sql CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id ON kbnteam.customer_order (comp_order_id); }}} === Резултати по индексирање === ||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || customer_order scan || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time || ___ ms || ___ ms || ___ % || '''Напомена:''' Прегледот `v_reviews_full` главно се потпира на споделени патеки на нарачки и достави. Индексот `idx_customer_order_comp_order_id` помага при JOIN-от на нарачки. Доколку работите со голем волумен на прегледи, разгледајте дополнителен индекс на `review(review_created_at)`.