Эффективная подкачка страниц (предел) запрос в 2000 SQLServer?

Повторяя сказанное @Taplar, похоже, атрибут action для элемента #new_comment_button не выглядит; это на самом деле где-то закодировано? Кроме того, этот атрибут action должен быть точным значением вашей службы AJAX - правильно ли он настроен?

10
задан Loki 6 February 2009 в 15:19
поделиться

5 ответов

Подкачка страниц Больших Наборов результатов и победителя использует RowCount. Также существует обобщенная версия для более сложных запросов. Но дайте кредит Jasmin Muharemovic :)

DECLARE @Sort /* the type of the sorting column */
SET ROWCOUNT @StartRow
SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn
SET ROWCOUNT @PageSize
SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn

Статья содержит весь исходный код.

Считайте "Обновление 05.05.2004" информации.!

12
ответ дан 3 December 2019 в 20:06
поделиться

Я думаю вложенный SELECT TOP n запрос является, вероятно, самым эффективным способом выполнить его.

SELECT TOP ThisPageRecordCount *
FROM Table
WHERE ID NOT IN (SELECT TOP BeforeThisPageRecordCount ID FROM Table ORDER BY OrderingColumn)
ORDER BY OrderingColumn

Замена ThisPageRecordCount с объектами на страницу и BeforeThisPageRecordCount с (PageNumber - 1) * items-per-page.

Конечно, лучший путь в SQL Server 2005 состоит в том, чтобы использовать ROW_NUMBER() функция в CTE.

6
ответ дан 3 December 2019 в 20:06
поделиться

Эффективность запроса действительно зависит от того, как базовая таблица структурирована. Если, скажите, что у Вас есть первичный ключ, названный идентификатором, который является ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ, и это - кластерный индекс, и можно предположить, что никто не делал IDENTITY_INSERTs на нем, можно сделать запрос как:

ВЫБЕРИТЕ таблицу TOP XXX FROM ГДЕ идентификатор> @LastPagesID;

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

1
ответ дан 3 December 2019 в 20:06
поделиться

Я думаю, что Вы действительно имеете, вот неопровержимый довод для обновления до SQL 2005.

В SQL 2005 это может быть сделано быстро и легко с:

select ROW_NUMBER() over (order by [MyField]) as rowNum, *
from [MyTable]
where rowNum between @firstRow and @lastRow

Если бы Вы действительно застреваете с SQL 2000, я волновался бы - Microsoft не собирается полностью поддерживать его намного дольше, учитывая, что это - теперь два поколения назад.

Там не будет одним лучшим способом сделать это, я боюсь - всеми решениями является вид взломов.

Ответ Petrov @Petar является, вероятно, самым последовательным, однако:

  • Если Вы имеете дело с кластерным индексом на меньшей таблице для Вашего вида затем, метод ASC-DESC (динамично создающий два вида каждый способ использовать TOP), вероятно, более быстр.
  • Если Ваши данные относительно статичны, и Ваш вид фиксируется затем, можно добавить собственное rowNum поле, которое Вы обновляете, когда Вы изменяетесь, порядок сортировки (звучит ужасным, но будет быстр для больших таблиц).

Я думаю, что Вы смотрите на несколько часов, настраивая с анализатором запроса каждый раз. Сохраненный proc не будет иметь большого значения так или иначе - кэширование плана запросов вряд ли будет узким местом.

0
ответ дан 3 December 2019 в 20:06
поделиться

Это - универсальная хранимая процедура SQL Server 2000, которая выполнит разбиение на страницы на любой таблице. Хранимая процедура принимает, что название таблицы, столбцы производит (значения по умолчанию ко всем столбцам в таблице), дополнительное ГДЕ условие, дополнительный порядок сортировки, номер страницы для получения и количество строк на страницу.

    CREATE PROCEDURE [dbo].[GetPage]
    @pTableName VARCHAR(30),
    @pColumns VARCHAR(200) = '*',
    @pFilter VARCHAR(200) = '',
    @pSort VARCHAR(200) = '',
    @pPage INT = 1,
    @pPageRows INT = 10
    AS

    SET NOCOUNT ON
    DECLARE @vSQL VARCHAR(4000)
    DECLARE @vTempTable VARCHAR(30)
    DECLARE @vRowStart INT
    DECLARE @vTotalRows INT

    SET @vTempTable = '##Tmp' + CAST(DATEPART(YYYY, GETDATE()) AS VARCHAR(4)) +
    CAST(DATEPART(MM, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(DD, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(HH, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(MI, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(SS, GETDATE()) AS VARCHAR(2)) +
    CAST(DATEPART(MS, GETDATE()) AS VARCHAR(3))

    SET @vSQL = 'SELECT ' + @pColumns + ', IDENTITY(INT, 1, 1) AS ROWID INTO ' + @vTempTable + ' FROM ' + @pTableName

    IF @pFilter != '' AND @pFilter IS NOT NULL
    SET @vSQL = @vSQL + ' WHERE ' + @pFilter

    IF @pSort != '' AND @pSort IS NOT NULL
    SET @vSQL = @vSQL + ' ORDER BY ' + @pSort

    EXECUTE (@vSQL)

    -- Get the total number of rows selected
    SET @vTotalRows = @@ROWCOUNT

    -- If page number = 0, set it to the first page
    IF @pPage = 0
    SET @pPage = 1

    -- If page number is beyond the last page, set page to the last page
    IF (@pPage * @pPageRows) > @vTotalRows
    BEGIN
    SET @pPage = @vTotalRows / @pPageRows
    IF (@vTotalRows % @pPageRows) != 0
    SET @pPage = @pPage + 1
    END

    SET @vRowStart = ((@pPage - 1) * @pPageRows) + 1
    SET @vSQL = 'SELECT * FROM ' + @vTempTable + ' WHERE ROWID BETWEEN ' + CAST(@vRowStart AS VARCHAR(10)) +
    ' AND ' + CAST((@vRowStart + @pPageRows - 1) AS VARCHAR(10)) + ' ORDER BY ROWID'
    EXECUTE (@vSQL)

    SET @vSQL = 'DROP TABLE ' + @vTempTable
    EXECUTE (@vSQL)

GO

Вот несколько примеров о том, как использовать его с помощью базы данных Northwing:

EXECUTE [dbo].[GetPage] 'Customers', '*', '', '', 1, 10
EXECUTE [dbo].[GetPage] 'Customers', '*', '', 'CustomerID DESC', 1, 10

Для подтверждения это не моя работа, но является любезностью http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=1055

С наилучшими пожеланиями, John

0
ответ дан 3 December 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: