IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
metazare
Člen
Avatar
metazare:16.5.2014 20:04

Dobrý večer, prosím poradí mi někdo jak...

PostgreSQL

item(item_id, item_name)
supplier(suppli­er_id, supplier_name)
store(id, item_id, supplier_id, price, vat, quantity)

Nastavil jsem primární klíč: id in store, item_id in item, supplier_id in supplier

Formulate the SQL query that returns the whole row of store whose id is the highest (maximum), i.e. the row that has been inserted into the relation store as last

-> SELECT max(id) FROM store (jak zjistim posledni zapis, který byl vložen?)

Pak mám pro tento dotaz vypsat jeho prováděcí plán (příkaz EXPLAIN). Zadal jsem EXPLAIN SELECT * FROM store; a vypsalo mi to: Seq Scan on store (cost=0.00..4584.00 rows=250000 width=31) Jak z toho poznám kolik "Uveďte výslednou odhadovanou cenu dotazu:" a "Uveďte předpokládanou velikosti odpovědi:"

Editováno 16.5.2014 20:06
 
Odpovědět
16.5.2014 20:04
Avatar
Odpovídá na metazare
Drahomír Hanák:16.5.2014 20:39

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.

 
Nahoru Odpovědět
16.5.2014 20:39
Avatar
metazare
Člen
Avatar
Odpovídá na Drahomír Hanák
metazare:16.5.2014 21:15

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?

 
Nahoru Odpovědět
16.5.2014 21:15
Avatar
Odpovídá na metazare
Drahomír Hanák:16.5.2014 21:32

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ší.

Editováno 16.5.2014 21:34
 
Nahoru Odpovědět
16.5.2014 21:32
Avatar
metazare
Člen
Avatar
metazare:17.5.2014 9:04

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)!"

 
Nahoru Odpovědět
17.5.2014 9:04
Avatar
metazare
Člen
Avatar
Odpovídá na metazare
metazare:17.5.2014 14:23

Tak jsem nakonec vytvoril index u quantity, item_name, a nejake to zrychleni je videt

 
Nahoru Odpovědět
17.5.2014 14:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.