2009-07-03 9 views
7

W programie Sql Server 2008 dostępnych jest wiele opcji stronicowania bazy danych za pośrednictwem procedury składowanej. Na przykład zobacz here i here.Która metoda stronicowania (Sql Server 2008) zapewnia najwyższą wydajność?

OPCJE:

  1. ROW_NUMBER() funkcja
  2. rowCount
  3. kursory
  4. tabel tymczasowych
  5. zagnieżdżonych zapytań SQL
  6. INNE

stronicowania przy użyciu ROW_NUMBER() jest znana z performance issues:

Proszę doradzić, która metoda stronicowania ma najlepszą wydajność (w przypadku dużych tabel z sprzężeń)?

Proszę również podać linki do odpowiednich artykułów, jeśli to możliwe.

Dziękuję.

+0

Należy prawdopodobnie dodać 300 rep bounty dopasować poziom szczegółowości poprosić o ... –

Odpowiedz

3

Jednym z pytań, na które należy odpowiedzieć, jest wyświetlenie całkowitej liczby wierszy użytkownikowi końcowemu. Aby obliczyć numer ostatniej strony, potrzebny jest również numer ostatniego wiersza.

Jeśli możesz obejść się bez tych informacji, dobrym rozwiązaniem jest tabela tymczasowa. Możesz wybrać klucz pirmary i użyć LIMIT do pobrania kluczy do interesującego Cię klucza. Jeśli zrobisz to dobrze, typowy przypadek użycia spowoduje tylko pobranie pierwszych kilku stron.

Jeśli potrzebujesz ostatniego numeru strony, możesz użyć ROW_NUMBER(). Używanie tabeli tymczasowej nie będzie dużo szybsze, ponieważ nie można użyć klauzuli LIMIT, czyniąc tę ​​strategię równoważną z obliczeniem ROW_NUMBER().

+0

+1 To jest istotna różnica, aby - w praktyce zawsze trzeba całkowitą liczbę wierszy. Testy wydajności, które nie obejmują tego, nie są dla mnie użyteczne. – RedFilter

+0

Dzięki. Łączna liczba wierszy będzie wymagana do wygenerowania numeru strony. Metoda ROWCOUNT wydaje się być najszybsza, ale wymaga unikalnej kolumny sortującej (co nie jest unikalne w moim przypadku). – dev

0

Możemy uzyskać liczbę wierszy za pomocą następującego zapytania.

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

OP wie, że pyta, jaki jest najlepszy sposób i wyraźnie łączy się z innym miejscem opisującym problemy (które prowadzą do kolejne rozwiązanie) z takim podejściem. –