Diskuze: Pomoct s řešením
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Dotaz pro zjištění řádku s nejvyšším ID uděláš tak, že si sestupně seřadíš záznamy podle ID a vybereš první z nich.
SELECT id, item_id, supplier_id, price, vat, quantity FROM store ORDER BY id DESC LIMIT 1;
Prováděcí plán pro jakoukoli SQL query v postgresu vypíšeš tak, že
před ten dotaz dáš EXPLAIN (všimni si ale, že
EXPLAIN SELECT * FROM store;
ti jaksi vypíše plán úplně jiné
query, než chceš ). Příkaz
EXPLAIN ukáže, jestli databázový systém použil pro vyhledávání index
(Index Scan), nebo prochází přímo tabulku (Seq Scan), odhadovaný čas
(
cost
), počet řádek, které prošel (rows
) atd.
Tohle ukáže pro každý krok query (např. seřazení, podmínka apod.) V
postgresu můžeš použít taky ještě EXPLAIN ANALYZE
. ANALYZE
vykoná na pozadí samotný dotaz a vrátí k odhadovanému času také čas,
jak dlouho se dotaz skutečně zpracovával. Všimni si, že bez klíčového
slova ANALYZE
neukáže skutečný čas, protože databáze tu
query vlastně nevykonala, ale pro odhadovanou cenu dotazu to není potřeba.
Odhadovaná cena bude položka cost
, odhadovaná velikost odpovědi
pak rows
.
Děkuji!
Formulovat dotaz, který načte názvy dodavatele, množství a cenu za položku s názvem "kufr", které máme skladem a jeho cena je nejméně 250 a až 10 ks k dispozici
SELECT * FROM STORE S JOIN ITEM I ON S.item_id = I.item_id WHERE I.item_name = 'kufr' AND price > 250 AND quantity > 10
Takto mám dobře?
Téměř. Zadání je vypsat název dodavatele, množství a cenu. Je teda potřeba ještě získat jméno dodavatele:
SELECT s.supplier_name, store.price, store.quantity FROM store
JOIN item i ON store.item_id = i.item_id
JOIN supplier s ON store.supplier_id = s.supplier_id
WHERE i.item_name = 'kufr' AND store.price > 250 AND store.quantity > 10
Mimochodem, na tomhle dotazu je EXPLAIN
už mnohem
zajímavější.
Vypsalo mi to
Nested Loop (cost=20.76..5888.41 rows=8 width=229)
-> Hash Join (cost=20.76..5886.15 rows=8 width=15)
Hash Cond: (store.item_id = i.item_id)
-> Seq Scan on store (cost=0.00..5834.00 rows=8350 width=23)
Filter: ((price > 250::numeric) AND (quantity < 10))
-> Hash (cost=20.75..20.75 rows=1 width=8)
-> Seq Scan on item i (cost=0.00..20.75 rows=1 width=8)
Filter: ((item_name)::text = 'kufr'::text)
-> Index Scan using supplier_pkey on supplier s (cost=0.00..0.27 rows=1 width=222)
Index Cond: (s.supplier_id = store.supplier_id)
Ono lze ještě provést nějakou tu optimalizaci, aby bylo o něco
rychlejší?
"Optimize the previous query in such way that the execution will be
significantly faster (at least 30% reduction in estimated costs).
Caveat: The optimization has to be generic, i.e. good for this type of query (so
item name, price and quantity bounds may change)!"
Tak jsem nakonec vytvoril index u quantity, item_name, a nejake to zrychleni je videt
Zobrazeno 6 zpráv z 6.