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

ПУБЛИКАЦИИ  

Автор: Глеб Уфимцев
Москва, 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г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz