Цель этой статьи — реализовать постраничный просмотр больших данных и оптимизировать скорость.
Для создания веб-приложения необходима функция просмотра страниц; эта проблема также является наиболее распространенной проблемой в течение долгого времени, и среди них существует множество алгоритмов подкачки для программ ASP, таких как использование Атрибуты PageSize объекта ado. Вычисляют страницы на основе общего количества записей, затем переходят к набору записей и затем выводят результаты. Также существуют способы написания хранимых процедур для реализации данных подкачки. Каждый из этих аспектов имеет свои преимущества и недостатки. Ниже я представлю алгоритм разбиения на страницы, который очень быстр в реальных
ключевых моментах: SQL (реализован с использованием TOP и автоматической нумерации);
сценария страницы (резервная функция браузера)
:
IIS/SQL-сервер/доступ
Структура таблицы:
создать таблицу содержимого таблицы(
Автоматический номер IDENTITY(int, 1,1) не равен нулю,
Классификационный код<I>var</I>char(20) null,
Title<I>var</I>char(255) NULL,
Content<I>var</I>char(4000) ноль,
время дата-время ноль,
)
Принцип реализации:
Эта таблица настроена с полем автоматической нумерации. Характеристика этого поля заключается в создании неповторяющейся формы, в том числе в том, что поле остается «изменчивым» после удаления записи (Примечание: обычно при построении системных таблиц это происходит). поле используется редко, поскольку номером нельзя свободно управлять, но здесь оно используется главным образом потому, что я хочу опустить в статье код для обслуживания номера).
Пагинация:
Затем первым шагом является запрос данных страницы; если имеется 100 записей и для одной страницы используется 20 записей, то обычный алгоритм разбиения по страницам следующий: «Общее количество страниц = общее количество записей, разделенное на контрольное количество страниц [Если] есть остаток, общее количество страниц плюс одна]", этот подход приводит к необходимости генерировать большой набор записей всех записей; поэтому некоторые люди предложили использовать алгоритм подкачки хранимых процедур. Первый - это asp скрипт для генерации большого набора записей, который довольно медленный, а последний убивает цыплят. Хотя я часто пишу хранимые процедуры, по моему мнению, написание хранимых процедур совершенно избыточно.
Многие знакомые с SQL знакомы с ролью измененного ключевого слова Top, например: выберите TOP 1 * from table1 — таким образом из таблицы Table1 возвращается набор записей, содержащий только одну запись; цель оптимизации страниц — избежать создания слишком большого набора записей, который можно полностью контролировать с помощью TOP, теперь таблица запросов должна выбирать 20 лучших автоматических нумераций, заголовков, содержимого и времени из таблицы содержимого;
Но теперь еще есть проблема, а именно, как его позиционировать. Невозможно, чтобы Top автоматически позиционировал и выводил для нас определенную страницу. Здесь пункт предназначен для вывода корректного контента по определенному условию; примечание: порядок сортировки записей очень важен, он определяет успех или неудачу этого алгоритма;
Здесь демонстрируется метод DESC, который расположен в обратном порядке. Например, для обновлений программного обеспечения на веб-сайте самое последнее обновление размещается первым, и это метод обратного порядка.
Хорошо, давайте посмотрим на реальный код. Сначала мы должны определить, является ли это стартовой страницей.
dim strSQL, я, endID, isBeginPage
const Cnt_PageSize = 20 'Определить размер каждой страницы записей
'Определите, является ли это операцией перехода на следующую страницу, проверив значение параметра Page, переданного браузером.
isBeginPage = isEmpty(request("Page")) или request("Page")="" или request("Page")<>"next"
'Вот ядро пейджинга
if isBeginPage then 'Если это стартовая страница
'Query = Перечислить записи, классификационный код которых равен параметру flbm, в обратном порядке и перечислить только первое перо Cnt_PageSize (Cnt_PageSize — это постоянное определение, например 20).
strSQL = "select TOP " & Cnt_pageSize & " автоматическая нумерация, заголовок, содержимое, время из таблицы содержимого, где кодировка классификации = '" & TRIM(SQLEncode(request("flbm"))) & "' порядок по автоматической нумерации desc"
else 'если не стартовая страница
if request("Page")="next" then 'Это написано здесь для повышения производительности кода. Если параметр следующий, это означает получение содержимого страницы.
'Query = Перечислите записи, классификационный код которых равен параметру flbm и должен быть меньше автоматического номера endID (endID также является параметром), и отсортируйте их в обратном порядке и перечислите только первое перо Cnt_PageSize (Cnt_PageSize - это постоянное определение, например 20)
strSQL = "select TOP " & Cnt_pageSize & " автоматическая нумерация, заголовок, содержимое, время из таблицы содержимого, где кодировка классификации = '" & TRIM(SQLEncode(request("flbm"))) & "' и автоматическая нумерация<" & request («endID») и «упорядочить по автоматическому номеру»
Конец, если
end if
'Откройте подключение к данным для выполнения SQL и создайте набор записей
установите rs = Cnn.Execute(strSQL)
если не rs.Eof, то 'Напишите здесь, чтобы определить, является ли это Eof. Это не обязательно, но здесь это имеет особое значение.
call TableTitle 'Вот самописная функция, используемая для создания тегов таблиц
call BeginTr 'Вот метка tr для создания таблицы
от i=0 до rs.fields.Count-1 'Обход полей набора записей
call AddCol(rs(i).name) 'Имя выходного поля
Следующий
вызовите endTr
, пока не rs.eof 'Прокручиваем содержимое набора записей и выводим
вызов BeginTr
для i=0 в rs.fields.Count-1
вызовите AddRow(ASPEncode(rs(i).value))
Следующий
вызов endTr
endID = rs("автоматическая нумерация") 'Здесь сохраняется значение автоматической нумерации каждого вывода
rs.MoveNext
Венд
call TableBottom 'Пока просто выводим все содержимое набора записей
'Здесь выводится знак перелистывания страницы, vbaIIF - самописная функция
Прототипом является <I>функция</I> vbaIIF(a,b,c)
если а то
vbaIIF=b
еще
vbaIIF =c
конец, если
завершить <I>функцию</I>
Реализация предыдущей страницы достигается вызовом функции браузера History.back(1) через скрипт. Тогда нет необходимости перегенерировать данные на стороне сервера при возврате на страницу и не нужно учитывать скорость. .
На домашней странице ссылка на предыдущую страницу должна быть недействительной. Это достигается с помощью vbaIIF(isBeginPage, "disabled", ""). Если это домашняя страница, добавьте в тег отключенный атрибут. не домашняя страница, добавьте команду History.back (1), используемую для отката страницы просмотра.
Следующая страница должна передать параметр Page, а для параметра EndID установлено значение next, чтобы указать действие следующей страницы. EndID указывает конечный номер текущего набора записей, и следующая страница будет разбита на страницы.
response.Write("〈a href=""#"" onclick=""java<I>скрипт</I>:" & vbaIIF(isBeginPage,"","history.back(1);") & "" " " & vbaIIF(isBeginPage," отключен ","") & "〉Предыдущая страница〈/a〉|〈a href=""TypeOptions.asp?flbm=" & request("flbm") & "&Page=next&endID = " & endID & """〉Следующая страница〈/a〉")
еще
«Здесь, оценивая, пуст ли набор записей, мы можем решить проблему продолжения перелистывания страниц до последней страницы.
если не isBeginPage, то
'Определите, пустая ли это запись и не является ли она стартовой страницей, затем сгенерируйте скрипт для страницы отката. Эффект заключается в том, что после входа на страницу происходит автоматический возврат на предыдущую страницу.
response.Write "〈<I>script</I> Language=java<I>script</I>〉" & vbCrlf
Ответ. Напишите "history.back(1); & vbCrlf".
Response.Write "〈/<I>скрипт</I>〉"
Ответ.Конец
else 'Если это запись стартовой страницы, она будет пустой и появится сообщение об отсутствии содержимого.
Ответ.Напишите «〈font color=blue〉В этой категории нет контента〈/font〉»
конец, если
конецЕсли
Резюме: благодаря пользовательским сценариям и навыкам выполнения SQL-запросов высокопроизводительные программы подкачки становятся простыми и быстрыми.
Я надеюсь, что коллеги смогут придумать лучшие алгоритмы подкачки данных в реальном времени.
Примечание. Поскольку форум ограничивает количество символов HTML, используются ключевые символы
.Китайские заглавные буквы.