SQL.RU
 client/server technologies
 Главная | Документация | Статьи | Книги | Форум | Блоги | Опросы | Гостевая | Рассылка | Работа | Поиск | FAQ |

Эффективный метод постраничной выборки

ПУБЛИКАЦИИ  

Автор: Глеб Уфимцев
Москва, 20 июня 2003

Предлагаемый метод не претендует на звание самого лучшего. Он, может быть, и не лучше, но уж точно не хуже других. Поиск решения основывался на следующих пожеланиях:

  1. Обращение к новой странице выборки не должно приводить к перезапросу всей выборки.

  2. Запрос страницы должен возвращать обычный привычный рекордсет.

  3. Инициация не должна быть чрезмерно долгой, чтобы запрос к таблице в 1000000 строк не утомил ожиданием.

  4. В любой момент должно быть разрешено выбрать любую страницу из выборки, в том числе и ранее выбранную.

  5. Страница должна содержать любое задаваемое кол-во строк.

  6. Страница должна начинаться с любой задаваемой строки по номеру.

Решение, удовлетворяющее всем этим пожеланиям стразу, было найдено. Вот оно:

  1. Имеем запрос, который мы хотим выбирать постранично

    select * from BigTable

    мы его не запускаем, а переходим к шагу 2.

  2. Инициализируем таким образом:

    declare @handle int,@rows int
    exec sp_cursoropen @handle OUT, 'select * from BigTable',1, 1, @rows OUT
    select @handle, @rows

    При этом получаем пустой рекордсет, содержащий метаданные-описания колонок, которые можно использовать для получения названия полей (и типов). После NextRecordset также получаем хендл получившегося курсора и кол-во строк во всей выборке. Хендл нам понадобиться для подстановки в следующие вызовы, и его надо сохранить на клиенте в глобальную переменную, а кол-во строк может быть использовано для определения кол-ва страниц.

  3. Получаем нужную страницу из выборки:

    exec sp_cursorfetch @handle,16,@rowid,@rowcount

    Где в @handle подставляем сохраненное значение хендла, в @rowid подставляется номер строки, с которой начинается интересующая нас страница, а в @rowcount подставляется кол-во строк на данной странице.

    Шаг 3 повторяем столько сколько нужно раз.

  4. Освобождаем ресурсы после того, как страницы уже больше не понадобятся

    exec sp_cursorclose @handle

[В начало]

Автор: Глеб Уфимцев  2003г.

Rambler's Top100 Рейтинг@Mail.ru  Administrator: Обратная связь 
Copyright: SQL.Ru 2000-2013