wiki:ReviewsFullView

Version 2 (modified by 223235, 2 weeks 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;

Тестирање на перформанси

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

Тест прашалници

BEGIN READ ONLY;
SET LOCAL statement_timeout = '60s';

-- Тест 1: по тип и компанија
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_reviews_full
WHERE review_type = 'order' AND company_id = 1;

-- Тест 2: по компанија
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_reviews_full
WHERE company_id = 1;

-- Тест 3: по доставувач
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_reviews_full
WHERE driver_user_id = 1;

ROLLBACK;

Резултати пред индексирање

Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.

Метрика Тест 1 (по тип и компанија) Тест 2 (по компанија) Тест 3 (по доставувач)
Planning Time _ ms _ ms _ ms
Execution Time _ ms _ ms _ ms
Rows Returned _ _ _
Начин на читање по табела _ _ _
Shared Hit Blocks _ _ _
Shared Read Blocks _ _ _
-- Планови и резултати пред дополнителното индексирање:

Дополнителни и заеднички индекси

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;

Резултати по индексирање

Мерењето ги користи истите тест прашалници и услови како почетното мерење.

Метрика Тест 1 (по тип и компанија) Тест 2 (по компанија) Тест 3 (по доставувач)
Planning Time _ ms _ ms _ ms
Execution Time _ ms _ ms _ ms
Rows Returned _ _ _
Начин на читање по табела _ _ _
Shared Hit Blocks _ _ _
Shared Read Blocks _ _ _
-- Планови и резултати по дополнителното индексирање:

Анализа на подобрување

Метрика Пред По Промена (%)
Execution Time (Тест 1) _ ms _ ms _ %
Execution Time (Тест 2) _ ms _ ms _ %
Execution Time (Тест 3) _ ms _ ms _ %

Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување.

Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.

Note: See TracWiki for help on using the wiki.