45793 (К вопросу об идентификаторах), страница 3
Описание файла
Документ из архива "К вопросу об идентификаторах", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "45793"
Текст 3 страницы из документа "45793"
Но можно использовать курсоры, и с помощью них осуществлять смещение до нужной записи и производить необходимую выборку.
SET NOCOUNT ON DECLARE @Page int, @PageSize int, @MinRecord int, @MaxRecord int -- номер страницы SET @Page = 10 -- размер страницы SET @PageSize = 20 SET @MinRecord = @Page*@PageSize SET @MAXRecord = @Page*@PageSize+@PageSize SET ROWCOUNT @MaxRecord -- создание курсора DECLARE @Cursor CURSOR SET @Cursor = CURSOR SCROLL KEYSET READ_ONLY FOR SELECT * FROM OriginalTable ORDER BY SortValue OPEN @Cursor -- смещение к нужной записи FETCH ABSOLUTE @MinRecord FROM @Cursor DECLARE @i int SET @i = 0 -- выор в цикле нужного количества WHILE @i < @PageSize BEGIN FETCH NEXT FROM @Cursor SET @i = @i + 1 END CLOSE @Cursor DEALLOCATE @Cursor SET ROWCOUNT 0 |
Этот способ чуть быстрее, чем предыдущий, но обладает тем недостатком, что возвращает не один набор записей, а каждую запись в отдельном наборе.
Можно так же скомбинировать два последних способа и позиционировать с помощью курсора, а затем считывать во временную таблицу нужное количество записей. Получившийся гибрид будет работать довольно быстро, а в некоторых случаях это самый быстрый вариант, и будет наиболее устойчив к различного рода вольностям в запросе.
Что касается относительной скорости всех методов, то тут можно смело использовать то, к чему душа больше лежит, разница составляет не больше нескольких процентов.
Ограничение первой выборки последней записью отображаемой страницы, позволяет довольно сильно повысить скорость выполнения запроса, так как в подавляющем большинстве случаев дальше второй-третьей страницы пользователи не заглядывают. Для очень больших выборок, критичных ко времени обращения к последним страницам, можно придумать хитрую процедуру, которая умела бы различать начальные и конечные страницы, и к последним применять обратную сортировку при выборке. Таким образом, к первым и последним страницам был бы наиболее быстрый доступ.
Oracle
В Оракле проблема постраничного вывода решается несколько проще. Стандартный способ, подходящий для подавляющего большинства задач выглядит примерно так:
SELECT * FROM (SELECT A.*, RowNum R FROM (SELECT * FROM user_tables ORDER BY table_name) A WHERE RowNum < :MaxRecord) WHERE R >= :MinRecord |
Однако при большом желании, так же можно придумать хитрую процедуру, которая по-разному обрабатывала бы начальные и конечные станицы большой выборки.
Yukon
В новой версии Microsoft SQL Server специальных ключевых слов, для подобной функциональности не добавилось, но, тем не менее, постраничную выборку можно немного упростить. В этой версии ключевое слово TOP стало понимать переменные, и даже запросы, и постраничный вывод можно организовать примерно так:
SELECT * FROM (SELECT TOP (@PageSize) * FROM (SELECT TOP (@Page * @PageSize + @PageSize) * FROM sys.objects ORDER BY name ASC) SO1 ORDER BY name DESC) SO2 ORDER BY name |
Скорости это не добавит, так как сервер все равно выполняет примерно одну и ту же работу, но количество нажатий на клавиатуру несколько уменьшится, что, возможно, продлит срок ее службы. Ну и код выглядит компактнее, что конечно приятно.
Упростить постраничный вывод вряд ли возможно. Существуют СУБД, в которых введен специальный синтаксис для вывода данных постранично, но это не более чем syntactic sugar, так как производятся те же действия, что и в примерах выше, просто часть реализации остается за кадром.
Список литературы
Для подготовки данной работы были использованы материалы с сайта http://www.rsdn.ru/