84 messaggi dal 07 settembre 2009
Ciao a tutti =)
mi stavo chiedendo se ci fosse la possibilità di prendere i record che si trovano in mezzo al database (ma non al centro), o meglio:
ho un db con 200000 record (ipotetici) e voglio prendere solo i record che vanno da 15500 a 15505 (ovviamente l'id non corrisponde necessariamente alla posizione del record nel db)

ho pensato (nel mentre stavo scrivendo questa domanda) di fare una cosa del genere:
SELECT top 15505 id,a,b,c,d FROM db WHERE id NOT IN (SELECT top 15499 id FROM db)

in modo da selezionare dal 15500 al 15505 solo che non so se in termini di lavoro per il server è più difficoltoso fare una select del genere o scorrere tutti i 15505 record per poi stampare solo gli ultimi 5 o se magari esiste qualcosa di più specifico e più performante

Grazie
Davide
Modificato da doppiomango il 03 settembre 2010 09.13 -
526 messaggi dal 24 maggio 2002
Contributi
La tua idea mi sembra buona.

Un'altra strada percorribile, qualora l'operazione da te descritta richieda troppo tempo, potrebbe essere quella di estrarre in un colopo solo gli id dei record dal database, inserirli in una lista e/o Array ed esegure la selezione degli id che cerchi utilizzando quest'ultima come base dati.
La lista dovrà essere necessariamente statica.

Diciamo che per ogni eseguzione dovrai poi fare una selct IN [gli id che trovi nella lista]

Il tutto, chiaramente, se puoi permetterti di caricare la lista una volta sola o con periodicità medio alta.

Marco.
potresti anche fare così:
DECLARE @TT table
(
ProductID int,
CategoryGroupID int,
CategoryGroupName varchar(10)
)

-- INSERISCO I DATI
................

-- seleziono solo i record con NUMERO DI RIGA fra 6 e 10
SELECT ProductID, CategoryGroupID
FROM
(
SELECT tbl.*, ROW_NUMBER() OVER (ORDER BY ProductID) rownum
FROM @TT as tbl
) seq
 WHERE seq.rownum BETWEEN 6 AND 10


Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
84 messaggi dal 07 settembre 2009
innanzi tutto grazie a entrambi

@makbox
purtroppo questa via non è attuabile visto che dovrei ripetere l'operazione ad ogni refresh di pagina
in pratica ho tante pagine create dinamicamente in base al numero di elementi da stampare per pagine e quelli presenti nel db e in base alla pagina che seleziono (1-2-3-4-5-...-100) devo prendere le relative righe dal db quindi caricare ogni volta 20000 record in un array è pesante

purtroppo ci sono pagine che avranno 10 elementi (2 pagine) e altri che magari ne avranno 100 o più e non posso prevedere il numero


@mizrael
sono alquanto nabbo riguardo a sql che uso in maniera molto limitata
mi spiegheresti in breve come funziona quello che hai scritto?
non è possibile usare solamente WHERE seq.rownum BETWEEN 6 AND 10 in una normale select?

so che è poco corretto ma io scrivo il codice sql direttamente nella pagina web (o al più nella classe .cs) e non so se può creare errori o meno.
purtroppo sono costretto a fare così perchè nel momento in cui devo spostare il sito in un server con access (per esempio) avere i comandi sql direttamente nel sito e non su sql server mi è più comodo per il trasferimento
Modificato da doppiomango il 03 settembre 2010 09.45 -
è indubbiamente più comodo per il trasferimento, ma MOOOLTO più scomodo per debug e manutenzione... al limite perché non fai dei file di testo con i singoli script? Leggi il file che ti serve (e magari metti il contenuto il una cache a parte così non fai più accesso al filesystem) dalla tua pagina e poi esegui l'sqlCommand...

A ogni modo, ora ti spiego un pò il codice:
SELECT ProductID, CategoryGroupID  -- così seleziono solo il campi che mi servono (i tuoi a,b,c,d per intenderci)
FROM 
( 
-- qui faccio una select completa sulla tabella ordinandoli per la sua primary key ed aggiungo un intero che indica il numero di riga (è un numero progressivo diverso quindi dall'ID). E' un'informazione che normalmente non hai ed useremo nella Where
SELECT tbl.*, ROW_NUMBER() OVER (ORDER BY ProductID) rownum 
FROM @TT as tbl 
) seq 
WHERE seq.rownum BETWEEN 6 AND 10 -- qui non faccio altro che selezionare il range che mi serve

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
84 messaggi dal 07 settembre 2009
SELECT ProductID, CategoryGroupID -- così seleziono solo il campi che mi servono (i tuoi a,b,c,d per intenderci)

ma devo lasciarlo così o devo mettere al posto di productid e categorygroupid a,b,c,d?

e il resto del codice (range e ProductID escluso eventualmente) lo lascio così giusto?


e questo che proponi tu è più performante rispetto alla mia idea di prima?


Grazie 1000 per la disponibilità
al posto di ProductID, CategoryGroupID devi mettere solo i campi che devi farti restituire, quelli li ho messi giusto per esempio.

Per quanto riguarda le performance, posso solo dirti di fare dei test con numeri grandi e controllare direttamente...

In generale però è sempre meglio creare una lista a parte con gli ID da selezionare e filtrare direttamente da lì

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
526 messaggi dal 24 maggio 2002
Contributi
doppiomango ha scritto:
innanzi tutto grazie a entrambi

@makbox
purtroppo questa via non è attuabile visto che dovrei ripetere l'operazione ad ogni refresh di pagina
in pratica ho tante pagine create dinamicamente in base al numero di elementi da stampare per pagine e quelli presenti nel db e in base alla pagina che seleziono (1-2-3-4-5-...-100) devo prendere le relative righe dal db quindi caricare ogni volta 20000 record in un array è pesante

purtroppo ci sono pagine che avranno 10 elementi (2 pagine) e altri che magari ne avranno 100 o più e non posso prevedere il numero


@mizrael
sono alquanto nabbo riguardo a sql che uso in maniera molto limitata
mi spiegheresti in breve come funziona quello che hai scritto?
non è possibile usare solamente WHERE seq.rownum BETWEEN 6 AND 10 in una normale select?

so che è poco corretto ma io scrivo il codice sql direttamente nella pagina web (o al più nella classe .cs) e non so se può creare errori o meno.
purtroppo sono costretto a fare così perchè nel momento in cui devo spostare il sito in un server con access (per esempio) avere i comandi sql direttamente nel sito e non su sql server mi è più comodo per il trasferimento
Modificato da doppiomango il 03 settembre 2010 09.45 -


Scusa ma non ho capito, la select che fai è diversa per ogni pagina?
Mi spiego meglio: tu hai 20000*100 = 2M record?

Io comunque non intendevo caricare la lista ad ogni chiamata di pagina ma caricarla "staticamente" o una volta sola o a intervalli prestabiliti.

Marco.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC