wiki:ReviewsFullView

Version 3 (modified by 223235, 13 days ago) ( diff )

--

Преглед: v_reviews_full

Својство Вредност
Шема kbnteam
Категорија Рецензии
Поврзани индекси Индекси за рецензии

Опис

Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата.

Секој запис го задржува типот на рецензијата и соодветните оценки. Ако една рецензија се однесува и на нарачка и на достава, се прикажуваат двата записа.

Еден ред за секој запис во поттипот за нарачка или достава. Рецензиите без поттип не се прикажуваат. Компанијата и доставувачот кај рецензија за достава можат да бидат 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 дефиниција

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 на 14 септември 2026 година. „Пред индексирање“ и „по индексирање“ ги означуваат групите наведени како „без индекси“ и „со индекси“ во евиденцијата. Точниот сет присутни индекси во секоја група не е евидентиран; „без индекси“ не потврдува отсуство на индекси од примарни и уникатни клучеви.

Наведените времиња се клиентски мерења од DBeaver, а не серверските Planning Time и Execution Time од EXPLAIN ANALYZE. Нема приложени планови, типови на скенирање или податоци за баферите. Вредностите се во милисекунди (ms).

Измерен прашалник

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) Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот.
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);

Проверка на индексите

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.

Дополнително тестирање - сè уште неизмерено

Следниот прашалник служи за ново мерење на серверскиот план со истиот филтер. Неговите резултати не се пополнети со клиентските времиња наведени погоре. За споредба се задржуваат исти податоци и поставки, се евидентираат присутните индекси, се ажурираат статистиките и се прават повеќе повторувања во двете состојби. Се споредуваат медијаната на времињата и плановите.

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 Не се измерени Не се измерени
Note: See TracWiki for help on using the wiki.