Autor Téma: Výkon - DISTINCT, JOIN  (Přečteno 609 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Výkon - DISTINCT, JOIN
« kdy: 10-12-2017, 11:33:31 »
Na úvod:
  Najprv som si čosi prečítal niečo na internete. Teraz nemám knihu pri sebe.

Ako som došiel k tejto téme:
  EMS SQL manager automaticky dáva do každého SELECT aj DISTINCT. Podvedome som sa proti tomu vzbúril.

K samotnej otázke:

DISTINCT vo mne vždy vyvolal predstavu veľkej práce naviac v pozadí. Internet mi to potvrdil
http://www.sqlteam.com/article/additional-criteria-in-the-join-clause
a citát
Citace
So here's my tip to you.  Whenever you have the urge to use the DISTINCT keyword, stop for a couple of minutes and ask yourself, "WHY do we have duplicates in the results"?  And more importantly, "HOW can I fix my query without resorting to the DISTINCT hack?"
Cítil/vedel som, že chyba je v JOIN. No nebol som schopný vytvoriť potrebné prepojenia. Včera večer ma osvietilo. Musím si vytvoriť dočasnú, či skôr pomocnú tabuľku. Tak to dokážem.

Prepokladám, že riešenie pomocou pomocnej tabuľky bude výkonnejšie než použitie DISTINCT. Mám to dosť často.

Pri blúdení po internete som narazil na niečo také:
Kód: [Vybrat]
// Prvá verzia
FROM TABLE2
  JOIN TABLE1 ON (TABLE1.IDCOSI = TABLE2.FKCOSI)
WHERE
  TABLE2.FIELD1 = NIECO

// Druhá verzia
FROM TABLE2
  JOIN TABLE1 ON (TABLE1.IDCOSI = TABLE2.FKCOSI)
    AND TABLE2.FIELD1 = NIECO
Sú tu dva efekty:
  • Výsledky môžu byť rôzne. S ohľadom na výskyt NULL
  • V prvom prípade sa najprv vykoná/uplatní JOIN  a až potom WHERE
  • V druhom prípade sa to všetko udeje v jednom kroku
Vychádza mi, že z pohľadu výkonu mám použivať druhú verziu.
Nemám si to s kým predebatovať a potvrdiť si svoj názor. Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 742
  • Karma: 32
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Výkon - DISTINCT, JOIN
« Odpověď #1 kdy: 10-12-2017, 16:45:51 »
Nemám si to s kým predebatovať a potvrdiť si svoj názor. Ďakujem.

Podivej se na execution plan. Ten Ti ukaze jak bude DBMS postupovat v pripade spousteni dotazu.
I'm a soldier, so don't panic!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:Výkon - DISTINCT, JOIN
« Odpověď #2 kdy: 10-12-2017, 18:04:53 »
Citace
Podivej se na execution plan. Ten Ti ukaze jak bude DBMS postupovat v pripade spousteni dotazu.
A po čase ho zmení :)  Viem o tom a to chcem použiť až pri ladení aplikácie.

Mne ide o všeobecné odporúčania, tak sú tie články písané, vychádzajúce z praxe a teórie.
Napr. jedno z odporúčaní znie:  ak je v časti GROUP BY menovaných veľa stĺpcov, vytvorte "derived table". Tým autor myslí subselect.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 742
  • Karma: 32
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Výkon - DISTINCT, JOIN
« Odpověď #3 kdy: 10-12-2017, 19:20:05 »
Citace
Podivej se na execution plan. Ten Ti ukaze jak bude DBMS postupovat v pripade spousteni dotazu.
A po čase ho zmení :)  Viem o tom a to chcem použiť až pri ladení aplikácie.

Firebird muze zmenit plan pro stejny SQL prikaz pokud zmenis schema dotcenych tabulek (napr. pridanim indexu). Neverim na nejakou jeho umelou inteligenci (ze by napr. dokazal pro konstantni schema pro stejny SQL prikaz sledovat jeho vyuziti a prikaz v jednu chvili zacal optimalizovat vhodnejsim planem, pripadne spustenim jineho prikazu).

Jedna rada, pokud budes hledat tipy pro SQL, zkus najit specificke pro Firebird, trebas tady.
I'm a soldier, so don't panic!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1308
  • Karma: 29
    • Pepak.net
Re:Výkon - DISTINCT, JOIN
« Odpověď #4 kdy: 10-12-2017, 19:39:32 »
Firebird muze zmenit plan pro stejny SQL prikaz pokud zmenis schema dotcenych tabulek (napr. pridanim indexu). Neverim na nejakou jeho umelou inteligenci (ze by napr. dokazal pro konstantni schema pro stejny SQL prikaz sledovat jeho vyuziti a prikaz v jednu chvili zacal optimalizovat vhodnejsim planem, pripadne spustenim jineho prikazu).
Na to nepotřebuje umělou inteligenci, na to stačí sledovat statistiky jednotlivých indexů. A to dělá.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 742
  • Karma: 32
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Výkon - DISTINCT, JOIN
« Odpověď #5 kdy: 10-12-2017, 19:44:55 »
Firebird muze zmenit plan pro stejny SQL prikaz pokud zmenis schema dotcenych tabulek (napr. pridanim indexu). Neverim na nejakou jeho umelou inteligenci (ze by napr. dokazal pro konstantni schema pro stejny SQL prikaz sledovat jeho vyuziti a prikaz v jednu chvili zacal optimalizovat vhodnejsim planem, pripadne spustenim jineho prikazu).
Na to nepotřebuje umělou inteligenci, na to stačí sledovat statistiky jednotlivých indexů. A to dělá.

Takze po nejake dobe pro stejny prikaz beze zmeny schematu aplikuje jiny plan?
I'm a soldier, so don't panic!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:Výkon - DISTINCT, JOIN
« Odpověď #6 kdy: 10-12-2017, 20:05:26 »
Pokiaľ viem, tak stačí ak sa časom pridá veľký objem dát a tým sa zmenia podmienky na použitie indexov. A už je iný plán. Aj preto chcem niektoré plány kontrolovať pri veľkom objeme testovacích údajov. Len tak skusmo som si nejaké nahodil, a hneď prvý formulár sa mi otvára 3 - 5 minút :(  Ale ešte nemám nič optimalizované. Napr. vytvorením indexov.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 742
  • Karma: 32
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Výkon - DISTINCT, JOIN
« Odpověď #7 kdy: 10-12-2017, 20:26:25 »
Pokiaľ viem, tak stačí ak sa časom pridá veľký objem dát a tým sa zmenia podmienky na použitie indexov. A už je iný plán. Aj preto chcem niektoré plány kontrolovať pri veľkom objeme testovacích údajov. Len tak skusmo som si nejaké nahodil, a hneď prvý formulár sa mi otvára 3 - 5 minút :(  Ale ešte nemám nič optimalizované. Napr. vytvorením indexov.

O tom nevim a Firebird znat nechci :) Pro Tvuj typ aplikace zvaz table partitioning (pokud Firebird umi).
I'm a soldier, so don't panic!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:Výkon - DISTINCT, JOIN
« Odpověď #8 kdy: 10-12-2017, 20:48:29 »
Citace
Pro Tvuj typ aplikace zvaz table partitioning (pokud Firebird umi).
Ty ma chceš priviesť do hrobu :D . No niečo v tom zmysle niečo vie. Minimálne to platí pre samotnú DB. Ale či aj pre tabuľky neviem. A neviem ani čo to vlastne znamená. Keď sa už dnes hrabem po internete tak pokračujem v tom ďalej.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:Výkon - DISTINCT, JOIN
« Odpověď #9 kdy: 10-12-2017, 21:00:10 »
Máš na mysli toto?

Common SQL : WINDOW FUNCTIONS
Example
SELECT A, B, C,
SUM(C) OVER(),
SUM(C) OVER(ORDER BY A, B),
SUM(C) OVER(PARTITION BY A),
SUM(C) OVER(PARTITION BY A ORDER BY B)
A B  C SUM SUM1 SUM2 SUM3
1 1 30 141   30      60     30
1 2 20 141   50      60     50
1 3 10 141   60      60     60
2 1 25 141   85      40     25
2 2 15 141  100     40     40
3 1 41 141  141     41     41
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 742
  • Karma: 32
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Výkon - DISTINCT, JOIN
« Odpověď #10 kdy: 10-12-2017, 21:10:14 »
Máš na mysli toto?

V DBMS se vytvori partitions tabulky napr. podle hodnot sloupce (treba datum) napr. pro urcity rozsah (treba rok, nebo mesic) a tabulka se interne fyzicky rozdeli na male kousky (jako by jich bylo fyzicky nekolik). Neni vsak treba menit SQL prikazy, tabulka se tvari jako jedna velka.
I'm a soldier, so don't panic!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:Výkon - DISTINCT, JOIN
« Odpověď #11 kdy: 10-12-2017, 21:26:31 »
Už som zistil, že máš na mysli niečo iné. A to iné FB nepodporuje.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):