Autor Téma: Select pre záznamy určené "zvonka"  (Přečteno 5256 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2610
  • Karma: 23
    • Verze Delphi: XE7 professional
Select pre záznamy určené "zvonka"
« kdy: 27-02-2013, 09:16:33 »
Potrebujem zostaviť SELECT pre INSERT INTO. Nech to nerobím po jednom zázname.
Viem to urobiť pomocou "WHERE in [zoznam_ID]". To sa neodporúča nakoľko sa vždy robí full scan tabuľky (FireBird).
Záznamy sú určené vo VirtualTreeView. Node.ChekState = csCheckedNormal.
 
Dá sa to vôbec? Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #1 kdy: 27-02-2013, 09:43:39 »
Potrebujem zostaviť SELECT pre INSERT INTO. Nech to nerobím po jednom zázname.
Viem to urobiť pomocou "WHERE in [zoznam_ID]". To sa neodporúča nakoľko sa vždy robí full scan tabuľky (FireBird).

Na ten full scan jsi prisel jak  :o

Citace
Dá sa to vôbec?

Neda, resp. dalo by se tu operaci in rozepsat, ale to nedava smysl

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1249
  • Karma: 28
    • Pepak.net
Re:Select pre záznamy určené "zvonka"
« Odpověď #2 kdy: 27-02-2013, 09:47:28 »
Dá sa to vôbec? Ďakujem.
Jakýkoliv SELECT jde použít pro INSERT INTO. Pokud dokážeš napsat podmínku pro záznamy, tak to můžeš zadaptovat pro INSERT INTO. Prostě nebudeš používat tradiční SELECT * ale budeš vybírat nějaký mix konstant, funkcí a sloupců: SELECT GEN_ID(ID,1) /* funkce */, 'ahoj' /* konstanta*/, nazev /* sloupec */.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 558
  • Karma: 23
Re:Select pre záznamy určené "zvonka"
« Odpověď #3 kdy: 27-02-2013, 09:59:42 »
Na ten full scan jsi prisel jak  :o
asi tam nemá indexy nebo je má blbě

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1249
  • Karma: 28
    • Pepak.net
Re:Select pre záznamy určené "zvonka"
« Odpověď #4 kdy: 27-02-2013, 10:19:37 »
Staré Firebirdy prý nepoužívaly indexy pro IN.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2610
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Select pre záznamy určené "zvonka"
« Odpověď #5 kdy: 27-02-2013, 10:30:18 »
Citace
Na ten full scan jsi prisel jak
Tak si to pamätám z literatúry - Císař. A ďalej sa tam písalo, že sa má použiť Exist, ak sa dá.
Citace
ale budeš vybírat nějaký mix konstant, funkcí a sloupců
Hm, to vyzerá zaujímavo, ale ako tam budem prechádzať strom? To musím urobiť v cykle. Taký select si neviem predstaviť.
 
Ešte otázka k IN. Má nejaké obmedzenia? Bol som upozornený, že v Delphi je in typu byte = 0..255
« Poslední změna: 27-02-2013, 10:34:02 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #6 kdy: 27-02-2013, 10:39:22 »
Staré Firebirdy prý nepoužívaly indexy pro IN.
Aha, to je mozny, o starych Firebirdech nic nevim. Nicmene pouzivame 2.5 a ta urcite indexy pouziva.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #7 kdy: 27-02-2013, 10:48:28 »
Ešte otázka k IN. Má nejaké obmedzenia? Bol som upozornený, že v Delphi je in typu byte = 0..255
V delphi je to mnozina bitu, ktera se vejde do 8 bytu tj. 256. Kolik je to u Firebirdu nevim, ale tady http://www.firebirdmanual.com/firebird/en/firebird-manual/2/limites-de-firebird/36 o tom nic nepisou.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1249
  • Karma: 28
    • Pepak.net
Re:Select pre záznamy určené "zvonka"
« Odpověď #8 kdy: 27-02-2013, 11:35:05 »
Citace
ale budeš vybírat nějaký mix konstant, funkcí a sloupců
Hm, to vyzerá zaujímavo, ale ako tam budem prechádzať strom? To musím urobiť v cykle. Taký select si neviem predstaviť.
To přece s otázkou nijak nesouvisí!
Pokud chceš procházet strom, tak k tomu slouží Common Table Expressions (CTE). Viz Google.
 
Citace
Ešte otázka k IN. Má nejaké obmedzenia? Bol som upozornený, že v Delphi je in typu byte = 0..255
1) Firebird nemá s Delphi nic společného.
2) Omezení je (bylo?) těsně pod 1500 prvků. Myslím 1499 je ta hranice, ale jestli je to včetně nebo bez, to nevím.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #9 kdy: 27-02-2013, 11:47:30 »
To přece s otázkou nijak nesouvisí!
Pokud chceš procházet strom, tak k tomu slouží Common Table Expressions (CTE). Viz Google.
Ja rozumim jeho otazce tak, ze ma neco nacteno ve VTV, v nem naklika checkboxy a ted chce udelat nejakou operaci s temi uzly ve VTV, ktere si naklikal.
A tam mu AFAIK nepomuze nic jineho, nez si udelat seznam ID za temi uzly a pridat ho jako operand k in...

A ten seznam ID sestavi prochazenim VTV - asi nejlepe zavolanim metody IterateSubtree (nebo jak se to jmenuje)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2610
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Select pre záznamy určené "zvonka"
« Odpověď #10 kdy: 27-02-2013, 12:10:07 »
Vidím to presne tak.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1249
  • Karma: 28
    • Pepak.net
Re:Select pre záznamy určené "zvonka"
« Odpověď #11 kdy: 27-02-2013, 12:10:58 »
A tam mu AFAIK nepomuze nic jineho, nez si udelat seznam ID za temi uzly a pridat ho jako operand k in...
No tak ještě by teoreticky mohl nainsertovat ta ID do nějaké temporary table a pak by mohl použít EXISTS, ale já bych samozřejmě použil ten IN. Dokonce ani v případě full table scanu u starého Firebirdu nemám pocit, že by to nějak významně zdržovalo (na rozumně velkých tabulkách, řekněme 100 tisíc záznamů nebo tak).

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 558
  • Karma: 23
Re:Select pre záznamy určené "zvonka"
« Odpověď #12 kdy: 27-02-2013, 12:37:03 »
No tak ještě by teoreticky mohl nainsertovat ta ID do nějaké temporary table a pak by mohl použít EXISTS, ale já bych samozřejmě použil ten IN. Dokonce ani v případě full table scanu u starého Firebirdu nemám pocit, že by to nějak významně zdržovalo (na rozumně velkých tabulkách, řekněme 100 tisíc záznamů nebo tak).

100K bez indexu už mi přijde hodně. Záleží taky na použití, člověka vteřina nevytrhne, pro strojové zpracování může být hodně i 10ms :-).

Pak taky bude obecně existovat nějaký limit na délku sql dotazu. Takže je možný, že když složíš podmínku s IN na 10K prvků, tak tě s tím db pošle někam.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2610
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Select pre záznamy určené "zvonka"
« Odpověď #13 kdy: 27-02-2013, 12:41:21 »
Citace
Pak taky bude obecně existovat nějaký limit na délku sql dotazu. Takže je možný, že když složíš podmínku s IN na 10K prvků, tak tě s tím db pošle někam.
Toho sa nemusím obávať. Jedná sa rádovo 10 až 30 záznamov.
Hlavne ma to zaujímalo z princípu a riešenie problému ako takého.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #14 kdy: 27-02-2013, 12:53:11 »
Pak taky bude obecně existovat nějaký limit na délku sql dotazu. Takže je možný, že když složíš podmínku s IN na 10K prvků, tak tě s tím db pošle někam.
Vedle toho pri velkem mnozstvi prvku nebude zanedbatelna ani operace prevodu kazdeho ID na string a retezeni techto stringu do CSV.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 558
  • Karma: 23
Re:Select pre záznamy určené "zvonka"
« Odpověď #15 kdy: 27-02-2013, 13:18:20 »
Vedle toho pri velkem mnozstvi prvku nebude zanedbatelna ani operace prevodu kazdeho ID na string a retezeni techto stringu do CSV.

V Delphi asi jo, jestli to při každé změně pořád vyrábí nové instance stringu. Nebo už přišli s něčím lepším (něco jako je StringBuilder v javě a .Net)? Ale pořád bude rychlejší ten string složit než ho zpracovat na straně db a vrátit podle toho data.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1678
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Select pre záznamy určené "zvonka"
« Odpověď #16 kdy: 27-02-2013, 13:44:53 »
Nebo už přišli s něčím lepším (něco jako je StringBuilder v javě a .Net)?
StringBuilder to ma uz D2009 akorat ze pokud nekdo nedela v Jave nebo C#, tak to zpravidla nezaznamenal

 

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í:
Datový typ v Delphi, který má True a False: