Jak wdrożyć stronicowanie w skuteczny sposób?

9

Mam zapytanie do bazy danych, które może spowodować duży zestaw wyników. Klient, który wyświetla dane, odbiera dane przez sieć, więc pomysł polegał na zminimalizowaniu ilości przesyłanych danych poprzez pobranie tylko pierwszych 50 wyników z bazy danych i przesłanie ich do klienta. Następnie zapewnię możliwość przejścia do drugiej strony w celu pobrania kolejnych 50 wyników itp. (Coś podobnego, co oferuje np. Google)

Pytanie brzmi, jaki jest skuteczny sposób wdrażania stronicowania. Chcę się upewnić, że mssql używa pamięci podręcznej w jak największym stopniu i że to samo nie jest wykonywane ponownie za każdym razem, gdy zmieniam stronicowanie.

Jest więcej klientów, którzy odpytują bazę danych w tym samym czasie. Używany silnik SQL: MS SQL 2005

Moje pomysły to:

  • Użyj przygotowanego statemenst sql, aby zapewnić współdzielenie planu wykonania
  • użyj zmiennej ROW_COUNT, aby pobrać tylko potrzebne wiersze

Ale czy to naprawdę najskuteczniejszy sposób? A może uważasz, że lepiej byłoby pobrać cały zestaw wyników i zaimplementować stronicowanie w kodzie, który wysyła dane do klienta?

Dziękuję za twoje wskazówki!

Pozdrawiam, Tomas

Tomas Walek
źródło

Odpowiedzi:

7

Zapytanie zostanie wykonane za każdym razem. SQL Server nie buforuje wyników.

Właściwe stronicowanie nie zostanie zaimplementowane do SQL Server 2011, ale do tego czasu dostępne są następujące opcje:

  • ROW_NUMBER () i zapytania na żądanie
  • buforowanie klienta

Przygotowana instrukcja SQL będzie również wykonywana za każdym razem.

Jeśli masz grubego klienta, buforowanie jest lokalne dla klienta. Jest to w większości OK, chyba że masz na przykład miliony obiektów blob.

W naszym kliencie WWW wyświetlamy wszystkie wyniki, ale pokazujemy tylko 100 najlepszych i mamy przycisk „Pokaż wszystko”, a następnie rozwijamy ukryty DIV z wierszami 101+. Nie buforujemy serwera WWW i nie oferujemy stronicowania.

gbn
źródło
Dzięki. A jakie jest lepsze podejście, jeśli użytkownik zmieni niektóre kryteria sortowania? Czy powinienem ponownie wykonać zapytanie z nowymi kryteriami, czy posortować wyniki na kliencie?
Tomas Walek
1
Sortowałbym w kliencie. Dane już tam są. Tak, baza danych jest dobra w sortowaniu, ale jeśli dane są takie same i dostępne, po co nawiązywać kolejne połączenia? Używamy dodatku jQuery, aby umożliwić sortowanie w przeglądarce :-)
gbn
4

To zależy od twojego środowiska. Skonfiguruję test przy użyciu obu metod i sprawdzę, która z nich będzie dla Ciebie najlepsza. Osobiście chciałbym stronę na serwerze. Im mniej danych za pośrednictwem przewodu i mniej danych w pamięci RAM klienta, tym lepiej. Jeśli możesz kontrolować specyfikacje komputera klienckiego, cały ruch odbywa się przez nienasyconą sieć LAN, a klienci zawsze szybko przeglądają wiele stron, wtedy możesz chcieć przeglądać strony u klienta.

Eric Humphrey - lotsahelp
źródło
Dzięki. Tak naprawdę potrzebuję obu: komunikacja między serwerem a klientem jest zaimplementowana w WCF, więc jest maksymalny rozmiar wiadomości, a jeśli wynikowy zestaw przekracza ten rozmiar, muszę wysłać więcej wiadomości, aby przesłać pełne dane do klienta. Klienci lubią także szybko przewijać wiele stron ... :(
Tomas Walek