R: postgres, ancora
Marcello Urbani
murbani a libero.it
Sab 31 Maggio 2003 15:15:52 UTC
>
>
>Secondo me e' errato pensare di dare al server un parametro; per quanto mi risulta il tutto dovrebbe procedere secondo questo schema
>
>1) il client assembla una query fatta e finita, in particolare sostituisce il valore attuale a _tutti_ i parametri formali e ottiene una stringa ASCII contenente uno statement SQL valido
>
>2) il client invia lo statement al server
>
>3) il server elabora lo statement, costruisce il result set e lo rispedisce indietro
>
>4) il client legge il result set.
>
>Tutte le operazioni di selezione, proiezione e join vengono svolte sul server (come e' giusto che sia). Quello che transita in rete e'
>
>*) la stringa contenete la query sql
>*) il result set _finale_ cioe' solo i dati che compongono il tuo risultato (e non e' detto che siano _tutti_ i record, vedi cursori).
>
>
>
Più o meno sì, ma di solito un database esegue una query in due fasi che
si possono da programma possono essere eseguite sia insieme che
separatamente: prepare ed execute. Il vantaggio nel tenere questi passi
separati è che in fase di prepare si possono lasciare dei parametri da
indicare poi in fase di execute, ed in questa maniera gran parte del
lavoro fatto dal DB (join, proiezione, magari parte della selezione)
viene eseguito solo la prima volta.
Per esempio (scopiazzato, scusate per eventuali errori), in perl:
------------------------
$q=$db->prepare("select nome, targa from utenti, auto where
auto.proprietario=utenti.nome and utenti.codice= ?");
$q->execute("1323");
...
$q->execute("1453");
...
------------------------
equivale a:
------------------------
$q=$db->prepare("select nome, targa from utenti, auto where
auto.proprietario=utenti.nome and utenti.codice= 1323");
$q->execute();
...
$q=$db->prepare("select nome, targa from utenti, auto where
auto.proprietario=utenti.nome and utenti.codice= 1453");
$q->execute();
...
------------------------
(tra l'altro ora che lo guardo, forse è proprio quello che cercava
cartolina).
Comunque, a seconda dell' implementazione del DB e della query
utilizzata, la prima versione può essere molto più veloce, ricordo una
volta con Oracle 7.3, client VB ed una query incasinatissima in cui la
prepare durava circa 20 volte la execute, un caso con SQL server 6 non
ha dato grossi cambiamenti, probabilmente il server o gli ODBC tenevano
una cache delle ultime prepare eseguite.
N.B. una query di cui hai fatto la prepare ti succhia delle risorse sul
DB, non puoi aprirne troppe contemporanamente,e bisogna ricordarsi di
chiuderle a fine lavoro.
>>sto leggendo di cursori, ma o non e' quel che cerco o non ho capito bene
>>l'uso che ne posso fare.
>>
>>
>
>Un cursore e' un modo per leggere il result set un record per volta, in maniera sequenziale o random. Da come ho capito io il tuo result set dovrebbe essere composto di una unica tupla, quindi aprire un cursore e' inutile; tuttavia in alcuni linguaggi (es java) i result set si possono interrogare solo usando un cursore. Se il linguaggio che usi ti da la possibilita' di ottenere direttamente l'intero result set con uno statement unico, fregatene dei cursori.
>
>
>
L'accesso a DB avviene comunque tramite cursori, tranne che li gestisce
la libreria; tipicamente lo statement unico fa
- prepare
- execute
- accesso tramite cursore
- chiusura della query
Resta la cosa più comoda quando non hai problemi di prestazioni.
Ciao
Marcello
Maggiori informazioni sulla lista
Lug
|