2009-06-29 73 views
2

這是關於這個問題的後續: ASP.NET next/previous buttons to display single row in a formASP.NET,SQL 2005年的「尋呼」

,因爲它說在網頁上面,那裏有在頁面上一個/下一個按鈕,檢索單行一個一次。

完全有〜500,000行。

當我通過每個訂閱號碼「頁面」時,表格會填寫訂閱者詳細信息。我應該在SQL服務器上使用什麼方法?

使用ROW_NUMBER()函數似乎有點矯枉過正,因爲它必須對所有〜500.000行進行編號(我猜?),那麼還有其他可能的解決方案嗎?

在此先感謝!

+0

你提到速度正在殺死你。 500,000行是非常小的土豆,所有事情都考慮在內。你在數據庫上建立了哪些索引? – Eric 2009-06-29 15:16:27

回答

3

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; 

而剛剛subsititute 50和60與你想要的行號的參數。

+0

已經這樣做了,而且速度很慢。我很好奇,如果有另一種方法。 – 2009-06-29 15:12:38

+0

@Tommy Jakobsen:在SalesOrderHeader表上有什麼索引? – 2009-06-29 15:17:16

+1

如果我使用ROW_NUMBER(),我不需要索引,是嗎? – 2009-06-29 15:18:29

0

有兩種可能的解決辦法(爲了這個目的,使用的201開始,100頁):

SQL

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

LINQ到SQL

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

如果您的ID字段有聚集索引,請使用前者。如果不是這樣,那麼這兩者都會花費相同的時間(LINQ返回500,000行,然後跳過,然後執行)。

如果您使用非ID進行排序並將其編入索引,請使用ROW_NUMBER()

編輯:因爲OP不是由ID排序,唯一的解決辦法是ROW_NUMBER(),這是我在端部放在那裏該條。

在這種情況下,表格未編入索引,因此請參閱here瞭解如何編制索引以提高查詢性能的想法。

0

湯米,如果你的用戶有時間每頁翻一頁500,000行,那麼他/她是唯一的。

我想我在這裏說的是,你可能能夠提供更好的用戶體驗。何時 - 頁面太多?建立一個搜索功能。