Создайте таблицу:
CREATE TABLE [TestTable] (
[ID] [int] ИДЕНТИЧНОСТЬ (1, 1) НЕ НУЛЬ,
[Имя] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Фамилия] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Страна] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Примечание] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) НА [ОСНОВНОЙ]
GO
: (20 000 элементов, тестирование с большим количеством данных будет более очевидным)
SET IDENTITY_INSERT TestTable ON
объявляет @i int
установить @i=1
пока @i<=20000
начинать
вставить в TestTable([id], FirstName, LastName, Country,Note) значения(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
установить @i=@i+1
конец
SET IDENTITY_INSERT TestTable OFF
--------------------------------------
Первое решение для пейджинга: (Используйте Not In и SELECT TOP пейджинг)
Форма заявления:
ВЫБЕРИТЕ ТОП-10*
ИЗ тестовой таблицы
ГДЕ (ID НЕ В
(ВЫБЕРИТЕ ТОП-20 идентификаторов
ИЗ тестовой таблицы
ЗАКАЗАТЬ ПО id))
ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ
ВЫБЕРИТЕ ВЕРХНИЙ размер страницы*
ИЗ тестовой таблицы
ГДЕ (ID НЕ В
(ВЫБЕРИТЕ размер страницы TOP * идентификатор номера страницы
ИЗ таблицы
ЗАКАЗАТЬ ПО id))
ПОРЯДОК ПО ID
----------------------------------------
Схема пейджинга вторая: (Использовать сумму насколько идентификатор превышает пейджинг SELECT TOP)
Форма заявления:
ВЫБЕРИТЕ ТОП-10*
ИЗ тестовой таблицы
ГДЕ (ID >
(ВЫБЕРИТЕ МАКС.(id)
ОТ (ВЫБЕРИТЕ ТОП-20 идентификаторов
ИЗ тестовой таблицы
ЗАКАЗАТЬ ПО id) AS T))
ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ
ВЫБЕРИТЕ ВЕРХНИЙ размер страницы*
ИЗ тестовой таблицы
ГДЕ (ID >
(ВЫБЕРИТЕ МАКС.(id)
ОТ (ВЫБЕРИТЕ размер страницы TOP * идентификатор номера страницы
ИЗ таблицы
ЗАКАЗАТЬ ПО id) AS T))
ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ
---------------------------------------
Схема подкачки третья: (с использованием подкачки хранимой процедуры курсора SQL )
создать процедуру XiaoZhengGe
@sqlstr nvarchar(4000), --query строка
@currentpage int, --Page N
@pagesize int --Количество строк на странице
как
установить nocount на
объявить @P1 int, --P1 — идентификатор курсора
@rowcount целое число
exec sp_cursoropen @P1 вывод, @sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount вывод
выберите потолок( 1.0*@rowcount/@pagesize ) как общее количество страниц, @rowcount как общее количество строк, @currentpage как текущую страницу
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
отключите nocount
для других решений: если нет первичного ключа, вы можете использовать временную таблицу или использовать решение три, но эффективность будет низкой.
Рекомендуется, чтобы при оптимизации добавление первичных ключей и индексов повышало эффективность запросов.
С помощью анализатора SQL-запросов сравните отображение: Мой вывод:
Вторая схема разбиения по страницам: (Использование идентификатора больше, чем What, и SELECT TOP для разбиения по страницам). Самая эффективная схема разбиения по страницам: необходимо объединить операторы SQL. (Использование Not In и SELECT TOP для разбиения по страницам). Схема подкачки три: (Использование схемы подкачки SQL) Подкачка хранимых процедур курсора) является наименее эффективной, но наиболее распространенной
. В реальных ситуациях требуется специальный анализ.