2009-07-03 13 views
7

In Sql Server 2008 sono disponibili numerose opzioni per l'impaginazione del database tramite la stored procedure. Ad esempio, vedere here e here.Quale metodo di paging (Sql Server 2008) per prestazioni MIGLIORI?

OPZIONI:

  1. ROW_NUMBER() funzione
  2. rowCount
  3. CURSORS
  4. tabelle temporanee
  5. Nested query SQL
  6. ALTRI

Paging tramite ROW_NUMBER() è noto per avere performance issues:

Si prega di comunicare, quale metodo di paging ha la migliore prestazione (per tabelle di grandi dimensioni con unisce)?

Fornire inoltre collegamenti agli articoli pertinenti, se possibile.

Grazie.

+0

probabilmente si dovrebbe aggiungere un po '300 rappresentante di taglie per abbinare il livello di dettaglio si chiede ... –

risposta

3

Una domanda a cui è necessario rispondere è se si desidera visualizzare il numero totale di righe all'utente finale. Per calcolare il numero dell'ultima pagina, è necessario anche l'ultimo numero di riga.

Se è possibile fare a meno di tali informazioni, una tabella temporanea è una buona opzione. Puoi selezionare il tasto pirmary e usare LIMIT per recuperare i tasti fino alla chiave che ti interessa. Se lo fai, il tipico caso d'uso recupera solo le prime pagine.

Se è necessario l'ultimo numero di pagina, è possibile utilizzare ROW_NUMBER(). L'utilizzo di una tabella temporanea non sarà molto più veloce perché non è possibile utilizzare la clausola LIMIT, rendendo questa strategia l'equivalente di un calcolo ROW_NUMBER().

+0

+1 Quella è una distinzione importante da fare - in pratica ho sempre bisogno il conteggio totale fila. Test delle prestazioni che non includono quelli che non mi sono utili. – RedFilter

+0

Grazie. Il numero totale di righe sarà richiesto per generare il numero di pagina. Il metodo ROWCOUNT sembra essere il più veloce, ma richiede una colonna di ordinamento univoca (che non è unica nel mio caso) – dev

0

È possibile ottenere un conteggio delle righe utilizzando la seguente query.

WITH data AS 
(
     SELECT ROW_NUMBER() OVER (order by memberid) AS rowid, memberid 
     FROM Customer 
) 
SELECT *, (select count(*) from data) AS TotalCount 
FROM data 
WHERE rowid > 20 AND rowid <= 30 
+0

L'OP sa che, sta chiedendo quale sia il modo migliore e si collega esplicitamente a un altro posto che descrive i problemi (che collega a ancora un'altra soluzione) con questo approccio. –

Problemi correlati