Autor Téma: Optimalizácia dopytov  (Přečteno 329 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Optimalizácia dopytov
« kdy: 30-09-2020, 09:56:10 »
Možno s tým má niekto skúsenosť a vie sa k tomu vyjadriť. Mám takúto situáciu/úlohu
  • Mám 100 SVB
  • Pre každé potrebujem načítať/zistiť nejaké hodnoty
Momentálne postupujem takto:
  • Mám cyklus podľa SVB - 100 cyklov
  • Tam volám funkciu (F1), kde sa volajú jednotlivé dopyty (15 kusov) pre konkrétne SVB. To znamená 1 500 volaní dopytov
Neviem či by pomohlo:
  • Pred cyklom si zavolám funkciu, kde sa zavolá všetkých 15 dopytov naraz pre všetky SVB
  • Budem tam musieť použiť LEFT JOIN, čo teraz nemám. Nepredpokladám, žeby to mal byť problém
  • Zavolám F1 a načítam si hodnoty z jednotlivých dopytov podľa primárneho kľúča SVB
Mám taký pocit, že by to malo byť rýchlejšie. No nemám s tým skúsenosť.
Predpokladám, že vykonanie jedného dopytu pre všetky SVB bude rádovo kratšie než 15 volaní  podľa jednotlivých SVB.
V téme dlhý čas je v prílohe uvedený príklad kódu.
Ďakujem.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1109
  • Karma: 47
    • Verze Delphi: 10.3
Re:Optimalizácia dopytov
« Odpověď #1 kdy: 30-09-2020, 10:21:35 »
Napsat uloženou proceduru, které třeba předáš ID prvního a posledního SVB, pro které se má výpočet provést, a veškeré výpočty se udělají jen na serveru a výsledky předají klientovi?

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 332
  • Karma: 9
    • Verze Delphi: XE2
Re:Optimalizácia dopytov
« Odpověď #2 kdy: 30-09-2020, 10:51:11 »
Napsat uloženou proceduru, které třeba předáš ID prvního a posledního SVB, pro které se má výpočet provést, a veškeré výpočty se udělají jen na serveru a výsledky předají klientovi?
Asi bych při sestavování SP  preferoval pracovat s množinou těch  ID SVB které potřebuji  (místo navrhovaného intervalu)
už jen proto, že nevím moc smyslu požadovat od všech SVB kompletní vystupy - snad jen při ročním výučtování
Jinak samozřejmě pokud to jen trochu jde posílat ze serveru jen hotové výsledky

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Optimalizácia dopytov
« Odpověď #3 kdy: 30-09-2020, 11:03:10 »
Asi bych při sestavování SP  preferoval pracovat s množinou těch  ID SVB které potřebuji  (místo navrhovaného intervalu)
A ty umis u FB predat mnozinu jako parametr do SP? To se delavalo predanim CSV ve stringu a parsovanim na urovni SP...

Jinak k tomu intervalu bych mel zasadni pripominku, ze predpoklada, ze jsou ID nejak usporadana, ale jako ID se idealne pouzivaji umele hodnoty, o jejichz posloupnosti lze vyslovit jen malo predpokladu...

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1109
  • Karma: 47
    • Verze Delphi: 10.3
Re:Optimalizácia dopytov
« Odpověď #4 kdy: 30-09-2020, 11:09:11 »
A ty umis u FB predat mnozinu jako parametr do SP? To se delavalo predanim CSV ve stringu a parsovanim na urovni SP...

Jinak k tomu intervalu bych mel zasadni pripominku, ze predpoklada, ze jsou ID nejak usporadana, ale jako ID se idealne pouzivaji umele hodnoty, o jejichz posloupnosti lze vyslovit jen malo predpokladu...

U nás typicky uživatel chce zpracovat jednu položku (od-do jsou stejné hodnoty), všechny položky (od se pošle třeba 0, do maximální hodnota, co se vejde), všechny položky od nějakého ID (ID postupně stoupá, takže to lze), nebo ručně vybrané (tam pak většinou voláme dotaz víckrát, protože to v našem případě jsou jednotky ID a pracnost toho, jak předat seznam, by nedávala smysl v porovnání s tím, že pro uživatele to zdržení jsou spíše milisekundy).

Na předávání velkého seznamu, když už to bylo nutné, jsem používal GLOBAL TEMPORARY TABLE, do které se předem ten seznam ID naplnil.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 332
  • Karma: 9
    • Verze Delphi: XE2
Re:Optimalizácia dopytov
« Odpověď #5 kdy: 30-09-2020, 11:16:19 »
A ty umis u FB predat mnozinu jako parametr do SP? To se delavalo predanim CSV ve stringu a parsovanim na urovni SP...

No spíše bych předával  INPUT_WHERE typ Varchar  a pak bych použil EXECUTE STATEMENT  FOR SELECT  ...
nebo jak píše vandrovník GLOBAL TEMPORARY TABLE,

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Optimalizácia dopytov
« Odpověď #6 kdy: 30-09-2020, 12:49:26 »
Neviem ako ste prišli k tomu výpočtu ;D  Nejde o žiaden výpočet. Takže Vaše reakcie sú tak mimo. Napr.:
  • prvý a posledný dátum v predpisoch
  • prvý a posledný dátum v predpisoch pre aktuálny rok
Tie sú najnáročnejšie - idú nad tou najväčšou tabuľkou. Ale sú v inej časti než teraz riešim.
.
Potom sú ďalšie ktoré mám na mysli v tejto otázke. Väčšinou typu: Má SVB
  • vlastníkov
  • byty
  • služby
  • ...
Takže v dopytoch sa uplatňujú hlavne agregačné funkcie Max(), Min(), Distinct - tomu sa snažím vyhýbať, ...
Funkcie vracajú výsledok: Result := (not) MyQuery.IsEmpty.
Tu Ide len a len o získanie údajov o SVB pri spustení programu.
Počas behu programu dokážem tieto informácie aktualizovať bez použitia dopytov.
Takže zopakujem otázku:
Je lepšie použiť dopyty pre všetky SVB a potom ich postupne prechádzať
kontra
dopyt vykonať pre samostatne pre každé SVB a opakovať ho x krát.
.
To radenie nie je problém. Všetko bude radené podľa primárneho kľúča SVB. To už mám použité aj teraz - v zozname takto získaných hodnôt.
.
V dopytoch mi pribudne
Kód: Delphi [Vybrat]
  1. FROM MYTABLE A
  2.   LEFT JOIN FOCS F ON (F.IDFOCS = A.FKFOCS)
  3. ORDER BY F.IDFOCS
  4.  
Tu nevidím problém
 







W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 332
  • Karma: 9
    • Verze Delphi: XE2
Re:Optimalizácia dopytov
« Odpověď #7 kdy: 30-09-2020, 14:00:38 »
Excellent
Rated 1 time
Neviem ako ste prišli k tomu výpočtu ;D  Nejde o žiaden výpočet. Takže Vaše reakcie sú tak mimo.
 

Asi jsem konečně pochopil co je výpočet  ;D

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Optimalizácia dopytov
« Odpověď #8 kdy: 30-09-2020, 14:08:46 »
Ja získanie datasetu z DB, len za použitia agregačných funkcií nepovažujem za výpočet. To vyúčtovanie výpočtom je.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1109
  • Karma: 47
    • Verze Delphi: 10.3
Re:Optimalizácia dopytov
« Odpověď #9 kdy: 30-09-2020, 14:11:25 »
Ja získanie datasetu z DB, len za použitia agregačných funkcií nepovažujem za výpočet. To vyúčtovanie výpočtom je.

Získání dat pomocí agregačních funkcí pro jednotlivé SVB jde ale přeci udělat jedním dotazem (GROUP BY SVB_ID), to se nemusí volat 100x, pro každé SVB zvlášť. Mj. pak stačí jeden průchod tabulkou, takže to bude mnohem rychlejší.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Optimalizácia dopytov
« Odpověď #10 kdy: 30-09-2020, 14:29:51 »
To som chcel počuť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Optimalizácia dopytov
« Odpověď #11 kdy: 01-10-2020, 20:27:28 »
Až na jeden prípad (ide sa oň pokúsiť) sa mi to podarilo urobiť jediným dopytom a pre všetky SVB naraz. Všetky ostatné vypadli. Čas mám do 4,5 sek 8)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Optimalizácia dopytov
« Odpověď #12 kdy: 01-10-2020, 20:33:22 »
a máš tam index?

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5446
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Optimalizácia dopytov
« Odpověď #13 kdy: 01-10-2020, 22:30:21 »
Mám, bez indexu to bolo vééééľmi dlhé. Tie som už dávnejšie premyslel a vyskúšal. Asi som ich trafil :)
Ten jeden prípad sa nedá prerobiť. V súčasnej podobe to je asi najrýchlejšie riešenie.
Pri bežnom používaní to bude raz-dva.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.