Як ефективно реалізувати пейджінг?


9

У мене є запит до бази даних, який може призвести до великого набору результатів. Клієнт, який відображає дані, отримує дані по мережі, тому ідея полягала в тому, щоб мінімізувати кількість переданих даних шляхом отримання лише перших 50 результатів із бази даних та відправлення їх клієнту. Тоді я надаю можливість перейти на другу сторінку, щоб отримати наступні 50 результатів тощо (щось подібне, наприклад, наприклад, google)

Питання в тому, який ефективний спосіб реалізації пейджингу. Я хочу переконатися, що mssql використовує кеш якнайбільше, і той самий не виконується ще раз щоразу, коли я змінюю підкачку.

Є більше клієнтів, які запитують базу даних одночасно. Використовуваний двигун sql: MS SQL 2005

Мої ідеї:

  • Використовуйте підготовлений sql statemenst для забезпечення спільного використання плану виконання
  • використовуйте змінну ROW_COUNT для отримання лише необхідних рядків

Але чи справді це найефективніший спосіб? Або ви вважаєте, що було б краще відновити весь набір результатів і здійснити пейджинговий код у коді, який надсилає дані клієнту?

Дякую за поради!

З повагою, Томаш

Відповіді:


7

Запит буде виконуватися щоразу. SQL Server не кешує результати.

Належне підказка не буде реалізована до SQL Server 2011, але до цього вашими параметрами (як ви визначили) є:

  • ROW_NUMBER () та запити за запитом
  • кешування клієнтів

Підготовлений оператор SQL також буде виконуватися щоразу.

Якщо у вас є товстий клієнт, то кешування локальне для клієнта. Це здебільшого нормально, якщо, наприклад, у вас мільйони крапель.

У нашому веб-клієнті ми надаємо всі результати, але лише показуємо топ-100 та маємо кнопку "Показати все", ніж розгортаємо прихований DIV рядками 101+. Ми не кешуємо веб-сервер і не пропонуємо підкачки.


Дякую. І що краще підходити, якщо користувач змінить якісь критерії сортування? Чи варто ще раз виконати запит за допомогою нових критеріїв або сортувати результати за клієнтом?
Томаш Валек

1
Я б сортував у клієнта. Дані вже є. Так, база даних добре розбирається, але якщо дані однакові та доступні, навіщо робити ще один дзвінок? Ми використовуємо надбудову jQuery для впорядкування сортування у браузері :-)
gbn

4

Це залежить від вашого оточення. Я налаштував би тест з використанням обох методів і побачив, який найкраще підходить для вас. Особисто я б розмістив сторінку на сервері. Чим менше даних по проводу і менше даних в оперативній пам'яті клієнта, тим краще. Якщо ви можете керувати специфікаціями клієнтської машини, увесь трафік здійснюється за ненасиченою локальною мережею, і клієнти завжди швидко переглядають декілька сторінок, то, можливо, ви хочете зробити сторінку у клієнта.


Дякую. Мені насправді потрібно і те, і інше: зв'язок між сервером і клієнтом реалізований в WCF, тому для повідомлення існує максимальний розмір, і якщо отриманий набір перевищує цей розмір, я повинен надіслати більше повідомлень для передачі повних даних клієнту. Клієнти також люблять швидко перегортати кілька сторінок ... :(
Томаш Валек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.