Я использую ROW_NUMBER (), чтобы сделать подкачку страниц с моим содержанием веб-сайта и когда Вы поражаете последнюю страницу это тайм-аут, потому что SQL Server занимает слишком много времени завершать поиск.
Уже существует статья относительно этой проблемы, но еще не кажется никаким идеальным решением.
Когда я нажимаю последнюю страницу StackOverflow, требуется меньше секунда для возврата страницы, которая действительно быстра. Я задаюсь вопросом, есть ли у них очень быстрые серверы баз данных, или просто у них есть решение для ROW_NUMBER () проблема?
Какая-либо идея?
Много лет назад, работая с Sql Server 2000, в котором не было этой функции, у нас была такая же проблема.
Мы нашли этот метод, который на первый взгляд кажется, что производительность может быть плохим, но сдул нас воду.
Попробуйте это
DECLARE @Table TABLE(
ID INT PRIMARY KEY
)
--insert some values, as many as required.
DECLARE @I INT
SET @I = 0
WHILE @I < 100000
BEGIN
INSERT INTO @Table SELECT @I
SET @I = @I + 1
END
DECLARE @Start INT,
@Count INT
SELECT @Start = 10001,
@Count = 50
SELECT *
FROM (
SELECT TOP (@Count)
*
FROM (
SELECT TOP (@Start + @Count)
*
FROM @Table
ORDER BY ID ASC
) TopAsc
ORDER BY ID DESC
) TopDesc
ORDER BY ID
The base logic of this method relies on the SET ROWCOUNT
expression to both skip the unwanted rows and fetch the desired ones:
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
The issue is well covered in this CodeProject article, including scalability graphs.
TOP is supported on SQL Server 2000, but only static values. Eg no "TOP (@Var)", only "TOP 200"