Înlocuirea tabelelor temporare în Firebird

În acest caz, problema este că coloana DENGI trebuie împărțită în două coloane, în plus, pentru a calcula suma totală. Soluția "frontală" arată astfel:







  1. Se efectuează o interogare a venitului: SELECTAREA NUMEI, DENGI DE LA CASH WHERE DENGI> = 0.
  2. Apoi, se face o interogare cu privire la costurile: SELECTEM NAME, DENGI FROM CASH WHERE DENGI.
  3. Apoi se calculează venitul total: SELECT SUM (DENGI) DIN NUMĂRUL ÎN CARE DENGI> = 0.
  4. Și, în final, suma totală a cheltuielilor: SELECTAȚI SUMUL (DENGI) DIN CASH WHERE DENGI.
  5. Rezultatele mai multor interogări sunt combinate într-un tabel din aplicația client.

În total, au fost solicitate cinci solicitări. Utilizarea tabelelor temporare aici este cea mai eficientă soluție. Pentru FIREBIRD, soluția este:

A doua abordare este folosirea combinației FOR SELECT și stocarea valorilor câmpului anterior în variabilele procedurii memorate.

Procedura corespunzătoare va arăta astfel:

Ca un caz special al primelor două abordări, trebuie remarcat faptul că puteți utiliza instrucțiunea FOR FOR SELECT INTO DO:

În același timp, dacă interpretați FOR SELECT ca un fel de tabel "temporar", atunci acest atașament oferă posibilitatea de a lucra cu mai multe tabele "temporare". De exemplu, dacă un tabel separat este păstrat în detaliu pentru un alt membru al familiei în același tabel ca CASH. dar cu numele CASH2:







apoi pentru a rezuma cei doi membri ai familiei sub forma:

puteți implementa următoarea procedură:

A treia abordare este folosită în acele cazuri în care este imposibil să se sorteze preselecția în funcție de condițiile de activitate. Apoi, este organizată o masă pseudo-temporară cu câmpurile necesare, procedeul este umplut mai întâi și apoi procesarea necesară a înregistrărilor într-un astfel de tabel se face. Iată soluția problemei prezentate în a doua abordare atunci când se utilizează tabele pseudo temporare:

Rezultatul procedurii:

Din moment ce pentru un motiv oarecare în tabelul TEMP pot rămâne „orfane“ înregistrări vechi, trebuie să-l curățați periodic (aici trebuie să utilizați câmpul TDATE), de exemplu, după cum urmează:

Ștergerea înregistrărilor orfane mai vechi de 10 zile

Se înțelege că a treia abordare este cel mai lent dintre toate, deoarece trecerea de masă se efectuează de două ori CASH, a făcut, de asemenea, să introducă și să actualizeze înregistrările în tabelul de timp pseudo și doar apoi de ieșire rezultat. Acest lucru adaugă, de asemenea, sarcina de a asigura curățarea regulată a tabelului TEMP. Prima și a doua versiune vor fi executate mult mai rapid, practic la viteza de recuperare a înregistrărilor. Experiența arată că tabelul de indexare CASH pe numele câmpului ecranate ar duce la primele rezultate ale interogării după câteva secunde, chiar și pe mese cu mai multe înregistrări pentru a fi de aproximativ 10 milioane de. Strings. În același timp, atunci când a treia abordare, în momentul primirii primelor înregistrări va fi de câteva secunde mai în tabelele cu numărul de înregistrări de circa 10 mii. Strings. De exemplu, următoarele rezultate (IBExpert program de date) au fost obținute prin efectuarea ITOG2 ITOG4 și procedurile de testare în exemplele de mai sus:







Articole similare

Trimiteți-le prietenilor: