| Version 4 (modified by , 12 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, а не серверските 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 | Не се измерени | Не се измерени |
