ASP.NET, SQL 2005 "пейджинг" - PullRequest
2 голосов
/ 29 июня 2009

Это продолжение вопроса: ASP.NET следующие / предыдущие кнопки для отображения одной строки в форме

Как сказано на странице выше, на странице есть предыдущая / следующая кнопка, которая извлекает одну строку по одной за раз.

Всего ~ 500 000 строк.

Когда я "пролистываю" каждый номер подписки, форма заполняется сведениями о подписчике. Какой подход я должен использовать на сервере SQL?

Использование функции ROW_NUMBER () кажется немного излишним, поскольку она должна насчитать все ~ 500.000 строк (я полагаю?), Так что есть другие возможные решения?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 29 июня 2009

ROW_NUMBER (), вероятно, ваш лучший выбор.

Из этой статьи MSDN: http://msdn.microsoft.com/en-us/library/ms186734.aspx

WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

И просто замените 50 и 60 параметром нужного вам номера строки.

0 голосов
/ 29 июня 2009

Томми, если у вашего пользователя есть время пролистать 500 000 строк на одной странице в строке, он / она уникален.

Полагаю, я хочу сказать, что вы можете обеспечить лучший UX. Когда - слишком много страниц? Создайте функцию поиска.

0 голосов
/ 29 июня 2009

Существует два возможных обходных пути (для этого используется начало 201, страницы 100):

SQL

SELECT TOP 100 * FROM MyTable WHERE ID > 200 ORDER BY ID

LINQ to SQL

var MyRows = (from t in db.Table 
              order by t.ID ascending
              select t).Skip(200).Take(100)

Если ваше поле идентификатора имеет кластерный индекс, используйте первый. Если нет, то и то, и другое займет одинаковое количество времени (LINQ возвращает 500 000 строк, затем пропускает, а затем занимает).

Если вы сортируете что-то, что НЕ является ID, и у вас есть это проиндексировано, используйте ROW_NUMBER().

Редактировать : Поскольку ОП не сортирует по идентификатору, единственное решение - ROW_NUMBER(), это пункт, который я поставил в конце.

В этом случае таблица не индексируется, поэтому см. здесь , чтобы узнать, как индексировать для повышения производительности запросов.

...