!!! Od 1.6.2022 jsem zaměstnán na HPP. Kde? To tady nemůžu napsat (kvůli Compliance). Ale na mém Linkedin účtu (nick: Jirka Pinkas) to určitě najdete. 😁 V současnosti mám volných 10 dní, které mohu alokovat na školení 😊

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í mi pomohlo ujasnit si jak má správně probíhat testování kódu, představilo užitečné knihovny a nástroje. Vše bylo podáno zábavnou formou, takže nebyl problém udržet pozornost. Navíc byl výhodou dostatek

Certicon
David

Jedno z nejlepších školení za poslední roky. Kromě seznámení se Springem apod. mě velmi příjemně překvapila hluboká znalost probírané látky a schopnost ji srozumitelně vysvětlit v případě ad hoc dotazů.

Jaroslav

Přestože jsem Cčkař, tak jsem se na školení JUnit dozvěděl nové věci. Zejména co se týče metodiky jednotkového testování a některých odborných termínů.

Retia
Jaromír


Novinky

25.12.2023: testcontainers pro lokální vývoj

25.12.2023: Kubernetes & Prometheus Documentary

9.8.2023: Rancher Desktop 2023