2

これは質問のフォローアップです: フォームに単一の行を表示するための ASP.NET の次/前のボタン

上のページにあるように、ページには前/次のボタンがあり、一度に 1 つの行を取得します。

全部で約 500,000 行あります。

各サブスクリプション番号を「ページング」すると、フォームにサブスクライバーの詳細が入力されます。SQL サーバーではどのようなアプローチを使用する必要がありますか?

ROW_NUMBER() 関数を使用すると、すべての ~500.000 行に番号を付ける必要があるため (私は推測しますか?)、少し過剰に思えますが、他に考えられる解決策はありますか?

前もって感謝します!

4

3 に答える 3

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;

50 と 60 を必要な行番号のパラメーターに置き換えます。

于 2009-06-29T15:07:54.690 に答える
0

考えられる回避策が 2 つあります (この目的のために、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)

ID フィールドにクラスター化インデックスがある場合は、前者を使用します。そうでない場合、これらの両方に同じ時間がかかります (LINQ は 500,000 行を返し、次にスキップし、次にかかります)。

ID ではないもので並べ替えていて、インデックスを作成している場合は、 を使用しますROW_NUMBER()

編集:OPはIDでソートされていないため、唯一の解決策はROW_NUMBER()、最後に追加した句です。

この場合、テーブルにはインデックスが作成されていないため、インデックスを作成してクエリのパフォーマンスを向上させる方法については、こちらを参照してください。

于 2009-06-29T15:11:16.367 に答える
0

トミー、あなたのユーザーが 1 行に 1 ページで 500,000 行をページングする時間があれば、そのユーザーはユニークです。

私がここで言っているのは、より良い UX を提供できるかもしれないということだと思います。いつ - ページが多すぎますか? 検索機能を構築します。

于 2009-06-29T15:12:09.970 に答える