!!! Od 1.6.2022 nastupuji do Komerční banky tvořit novou digitální banku. Školení se nechci úplně vzdávat, v současnosti přemýšlím nad tím, jak alespoň pár školení za rok uskutečnit. Pokud by mi někdo se školeními chtěl pomoci, tak se mi ozvěte. Na JavaDays opět budu, to si nenechám ujít :-) Teď budu mít v KB hodně práce než si všechno sedne, ale jakmile to nastane, tak hned budu přemýšlet nad tím, jak alespoň pár školení za rok uskutečnit, protože je hromada lidí, které bych opět strašně moc rád viděl a považuji je za přátele. Časem (nejspíš v příštích pár měsících) vytvořím nový blog na separátní doméně a novinky Java a SQL školení dále rozšiřovat nebudu. Pokud se něco změní, tak to dám včas vědět zde na webu a na blogu. !!!

Troška na téma Optimalizace SQL dotazů

publikováno: 1.3.2016

Mám databázi, ve které jsou tyto tři tabulky:

  • artifacts_detail (140,000 záznamů)
  • java_classes (3,250,000 záznamů)
  • java_class_methods (26,500,000 záznamů)

a potřeboval jsem je spojit dohromady a získat prvních X záznamů, pak dalších X záznamů apod. Poznámka: Jedná se o databázi PostgreSQL. U ostatních to funguje podobně, jenom se malinko liší syntaxe.

Nejprve jsem udělal tento SELECT, ve kterém jsem pospojoval všechny tabulky a vybral například prvních 100 záznamů:

select *
from java_class_methods m 
  join java_classes c 
    on m.java_class_id = c.id 
  join artifacts_detail a 
    on c.group_id = a.group_id and c.artifact_id = a.artifact_id 
order by m.java_class_id, m.signature
limit 100;

Problém byl ten, že tento SELECT nikdy nedoběhl ... čekal jsem asi hodinu bez úspěchu. Podotýkám, že je vše správně "oindexované", čili v tom problém nebyl. Pro 10 záznamů to bylo rychlé, ale už pro 100 záznamů to bylo neuvěřitelně pomalé (a později jsem potřeboval těch záznamů získat daleko víc). Tak jsem to předělal následovně:

select *
from (select * 
      from java_class_methods m 
      join java_classes c 
        on m.java_class_id = c.id
      order by m.java_class_id, m.signature 
      limit 100) a 
join artifacts_detail b 
on a.group_id = b.group_id and a.artifact_id = b.artifact_id;

A tohle bylo hotové za pár desítek milisekund. Proč? Protože jsem co nejdříve výrazně omezil velikost výstupní matice a až v dalším kroku jsem k ní připojoval další tabulku.

 

Reference

Školení bych doporučil všem lidem, kteří se chtějí dozvědět něco o DB. Na školeni jsem přišel, jako úplný nováček, co se týče práci s DB a odcházel plný dojmů a

Ondřej

Osobně jsem trošku stále váhající, jestli a jak moc SQL použít. Ale určitě hlavní je to, že se teď už tolik nebojím. Je to pro mě začátek dlouhé cesty. Osobně

Robert

Zajímavé školení, které vhodně kombinovalo teorii a praxi.

Ministerstvo financí
Jan


Novinky

9.9.2021: SQL Developer & Remote Debug

22.3.2019: Termíny SQL školení léto 2019
Nové termíny!!!

3.1.2018: Oracle XE 12c nebude, místo toho bude Oracle XE 18c
V roce 2018 nás čeká nová XE verze a nové verzování