Newsgroup: it.comp.software.database
Titolo: Select * con tabelle di grosse dimensioni

Io ho sempre utilizzato Interbase, e volevo avere dei chiarimenti.
Se io ho una tabella di dimensioni abbastanza
grossa e faccio un select *, e' normale che se io voglio
accedere, ad esempio, all'ultimo record, l'operazione
e' molto lenta (proporzionale al numero di record) ?
In pratica i record vengono fetchati tutti, nonostante
gli indici creati... io ho attribuito la "colpa"
ai cursori, ma non ne sono sicuro.
mi chiedevo se cio' e' normale o con altri
motori sql cio' non avviene.
Grazie 1024 a chi mi chiarisce questo dubbio!
Ciao,
Alan

 wrote in message
8uhto8$1tpu9$1...@ID-44131.news.dfncis.de...


Ciao Alan,
il tuo problema è abbastanza ovvio, in effetti se hai tabelle con molti
record la ricerca può rallentare molto, per quanto ho capito però tu devi
impostare delle ricerche magari basate su gli ultimi record anche se
nell'istruzione SQL vuoi Selezionare tutti i campi (*).
Una possibile soluzione è quella di spostare il cursore verso il basso
nell'handle di istruzione relativo. Faccio un esempio basandomi sul modulo
Mysql.pm e la sua API
$db_handle=Mysql->connect(parametri);
$ist_handle=Mysql->query("SELECT * FROMA tabella");
--------a questo punto ho uno statement in $ist_handle
una chiamata del tipo
$numrow=$ist_handle->numrows;
for($i=0;$i<$numrow;$i++)
{($col1,$col2,..,$coln)=$ist_handle->fetchrow;
 print "$col1 ecc";}
chiaramente mi scorre lo statement partendo dall'inizio, esiste però un modo
per spostare il cursore diciamo a metà dello statement
$numrow2=$numrow/2;
$ist_handle->dataseek($numrow2);
a questo punto chiamate del tipo fetchrow iniziano a scorrere lo statement
partendo dalla metà, ovviamente passando a dataseek un parametro numerico
diverso spostiamo il cursore in quella precisa posizione.
Il problema vero però è che comunque sia l'esecuzione della query va in
effetti a raccogliere tutti i record quindi una soluzione del genere può
migliorare le cose ma non esageratamente, è altrettanto ovvio che se te fai
un SELECT * incondizionato vai a ricercare tutti i record.....
Una soluzione potrebbe essere quella di utilizzare un campo auto_increment
come ad esempio un ID a chiave primaria che quindi mi rappresenta il numero
di inserimenti e ricercare con SELECT impostando la condizione necessaria su
tale campo, che so magari maggiore di x...
attenzione però che se elimini i record dalla tabelle le successive entrate
vengono numerate sempre incrementando l'id che alla fine non rappresenta più
il numero effettivo dei record...
Fammi sapere!!
ciao ciao

 rappresenta piů il numero effettivo dei record...
potrebbe essere un'idea, cmq una mia idea me l'avevo gia' fatta,
ovvero che quando possibile bisogna limitare il numero di record
ritornati
select campo from tabella where=<QUALCHE COSA DI RAGIONEVOLE>
Grazie per le risposte a tutti!
Ciao,
Alan

ciao!
Per prima cosa rispondo alla domanda sui$ davanti alle variabili, in PERL
servono per indicare uno scalare, in pratica una variaile normale
$ist_handle č un gestore di istruzione, supponiamo che io voglia eseguire un
SELECT su un database aperto a assegnato al su gestore $db_handle
devo scrivere:
$ist_handle=$db_handle->query("la mia query");
a questo punto in $ist_handle ho ogni tipo di informazione su comando SELECT
$rows=$ist_handle->numrows in effetti mi restituisce in numero di righe
contenute nel gestore $ist_handle
il comando $ist_handle->dataseek(n) mi permette di posizionare il cursore
all'interno dei record ottenuti!!!
non so dirti perņ se esiste qualcosa di simile in IB
ciao
Claudio Bellucci

 non so dirti però se esiste qualcosa di simile in IB
mi sa che e' inserito tra le cose da fare...
"better implementation of record count", speriamo ;)
Grazie di nuovo!
Alan

 Alan
La select in questione dovrà avere nella condizione where
i campi su cui sono stati creati gli indici