Повторяя сказанное @Taplar, похоже, атрибут action
для элемента #new_comment_button
не выглядит; это на самом деле где-то закодировано? Кроме того, этот атрибут action
должен быть точным значением вашей службы AJAX - правильно ли он настроен?
Подкачка страниц Больших Наборов результатов и победителя использует 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" информации.!
Я думаю вложенный 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.
Эффективность запроса действительно зависит от того, как базовая таблица структурирована. Если, скажите, что у Вас есть первичный ключ, названный идентификатором, который является ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ, и это - кластерный индекс, и можно предположить, что никто не делал IDENTITY_INSERTs на нем, можно сделать запрос как:
ВЫБЕРИТЕ таблицу TOP XXX FROM ГДЕ идентификатор> @LastPagesID;
Это доберется, Вы заканчиваетесь максимально быстро. Все остальное это будет действительно эффективным, является некоторым вариантом на этом - возможно, это не идентификатор - возможно, что Вы используете для страницы, на самом деле дата, которую Вы знаете, чтобы быть уникальными, но Вы понимаете... В () здесь будут, вероятно, работать базирующиеся запросы, показанные, но они не коснутся производительности частичного кластеризованного или покрывающего индексного сканирования.
Я думаю, что Вы действительно имеете, вот неопровержимый довод для обновления до 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 является, вероятно, самым последовательным, однако:
Я думаю, что Вы смотрите на несколько часов, настраивая с анализатором запроса каждый раз. Сохраненный proc не будет иметь большого значения так или иначе - кэширование плана запросов вряд ли будет узким местом.
Это - универсальная хранимая процедура 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