= Преглед: v_menu_drink = ||= Датотека ||= `views/01_menu_drink_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Мени и Каталог || ||= Поврзани индекси ||= `indexes/v_menu_drink_index.sql` || == Опис == Едноставен преглед кој ги наведува сите пијачи достапни на секој ресторан заедно со деталите за ресторанот. Се користи за прелистување на мени и договорни нарачки преку веб апликацијата. == Зависности == ||= Табела ||= Тип на употреба || || `kbnteam.drink` || Главна табела — ги содржи деталите за пијачот || || `kbnteam.restaurant` || JOIN — ги додава деталите за ресторанот || == Излезни колони == ||= Колона ||= Извор ||= Опис || || `drink_id` || `drink.drink_id` || Примарен клуч на пијачот || || `drink_name` || `drink.drink_name` || Назив на пијачот || || `drink_milliliters` || `drink.drink_milliliters` || Волумен во милилитри || || `drink_price` || `drink.drink_price` || Цена || || `rest_id` || `restaurant.rest_id` || Примарен клуч на ресторанот || || `rest_name` || `restaurant.rest_name` || Назив на ресторанот || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_menu_drink AS SELECT d.drink_id, d.drink_name, d.drink_milliliters, d.drink_price, r.rest_id, r.rest_name FROM kbnteam.drink d JOIN kbnteam.restaurant r ON r.rest_id = d.rest_id; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: целосен скен на прегледот EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_menu_drink; -- Тест 2: филтрирање по ресторан (препорачано за мерење на индексот) EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_menu_drink WHERE rest_id = 1; }}} === Резултати пред индексирање === Извршете ги горните прашања '''пред''' да ја примените датотеката `indexes/v_menu_drink_index.sql`. ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || Scan Type || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Применети индекси === {{{ #!sql -- indexes/v_menu_drink_index.sql -- Note: uq_drink_restaurant_name already supports (rest_id, drink_name). CREATE INDEX IF NOT EXISTS idx_drink_rest_id_drink_id ON kbnteam.drink (rest_id, drink_id); }}} === Резултати по индексирање === Извршете ги истите прашања '''по''' примена на `indexes/v_menu_drink_index.sql`. ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || Scan Type || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time || ___ ms || ___ ms || ___ % || || Scan Type (Тест 2) || Seq Scan || Index Scan || — || '''Очекувано:''' `idx_drink_rest_id_drink_id` на `drink(rest_id, drink_id)` го поддржува JOIN-от со `restaurant` и директното филтрирање по `rest_id`. На мали датасети планерот може да остане на Seq Scan. Подобрувањето е поизразено при филтрирање по конкретен ресторан.