Come implementare il paging in modo efficace?


9

Ho una query di database che potrebbe comportare un grande set di risultati. Il client che visualizza i dati riceve i dati sulla rete, quindi l'idea era di ridurre al minimo la quantità di dati trasferiti recuperando solo i primi 50 risultati dal database e inviandoli al client. Quindi fornirò la possibilità di passare alla seconda pagina per recuperare i prossimi 50 risultati ecc. (Qualcosa di simile a ciò che offre ad esempio google)

La domanda è qual è il modo efficace di implementare il paging. Voglio assicurarmi che mssql usi la cache il più possibile e che lo stesso non venga eseguito ancora una volta ogni volta che cambio il paging.

Esistono più client che eseguono query sul database contemporaneamente. Motore sql usato: MS SQL 2005

Le mie idee erano:

  • Utilizzare sql statemenst preparato per garantire la condivisione del piano di esecuzione
  • utilizzare la variabile ROW_COUNT per recuperare solo le righe necessarie

Ma è davvero il modo più efficace? O pensi che sarebbe meglio recuperare l'intero set di risultati e implementare il paging nel codice che invia i dati al client?

Grazie per i tuoi consigli!

Saluti, Tomas

Risposte:


7

La query verrà eseguita ogni volta. SQL Server non memorizza nella cache i risultati.

Il paging corretto non verrà implementato fino a SQL Server 2011, ma fino ad allora le opzioni (come identificate) sono:

  • ROW_NUMBER () e query su richiesta
  • memorizzazione nella cache del client

Ogni volta verrà eseguita anche un'istruzione SQL preparata.

Se si dispone di un client fat, la memorizzazione nella cache è locale per il client. Questo è per lo più OK a meno che tu non abbia milioni di BLOB per esempio.

Nel nostro client Web visualizziamo tutti i risultati ma mostriamo solo i primi 100 e abbiamo un pulsante "Mostra tutto" che espande un DIV nascosto con le righe 101+. Non memorizziamo nella cache il server Web e non offriamo il paging.


Grazie. E quale approccio migliore se l'utente modifica alcuni criteri di ordinamento? Devo eseguire nuovamente la query con i nuovi criteri o ordinare i risultati sul client?
Tomas Walek,

1
Vorrei ordinare nel client. I dati sono già lì. Sì, un database è bravo nell'ordinamento ma se i dati sono gli stessi e disponibili perché effettuare un'altra chiamata? Usiamo un componente aggiuntivo jQuery per abilitare l'ordinamento nel browser :-)
gbn

4

Dipende dal tuo ambiente. Vorrei impostare un test utilizzando entrambi i metodi e vedere quale funziona meglio per te. Personalmente, vorrei sfogliare sul server. Meno dati via cavo e meno dati nella RAM del client, meglio è. Se è possibile controllare le specifiche del computer client, tutto il traffico viene trasferito su una LAN non saturata e i client passano sempre rapidamente da una pagina all'altra, quindi è possibile effettuare una pagina sul client.


Grazie. In realtà ho bisogno di entrambi: la comunicazione tra server e client è implementata in WCF, quindi esiste una dimensione massima per un messaggio e se il set risultante supera questa dimensione, devo inviare più messaggi per trasferire i dati completi al client. Ai clienti piace anche scorrere rapidamente più pagine ... :(
Tomas Walek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.