4

Ok、

私のGridViewに比較的小さなデータセットをテストしており、すべてうまくいきました。しかし、私は今、適切な UAT に移行し、17,000 レコードをグリッドにロードしようとしました。これにより、基本的に Web アプリが停止しました。

基本的に、ユーザーがログインすると、検証時にすべてのデータ グリッドがロードされ、そのうちの 1 つに 17k レコードが含まれます。すべてが読み込まれるまで、エンド ユーザーはログオン ページで左利きになります。だから私はそれを修正する必要があります。

グリッドのコードは次のとおりです。

DataTable dtValueDateCurrency = null;               
SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Reporting"].ConnectionString);
using (conn)
{
    conn.Open();
    //Load all other grid data
    using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(TSQL1, conn))
    {
        dtValueDateSummary = new DataTable();
        sqlAdapter.Fill(dtValueDateSummary);
        grdValueDateSummary.DataSource = dtValueDateSummary;
        grdValueDateSummary.DataBind();
    }
 }

ロード時間を増やす方法はありますか?JQueryでこれを処理しているため、ページネーションはオプションではありません。

4

5 に答える 5

6

1 回のクエリで 17,000 レコードをロードするのはあなたの命を奪っています。グリッドビューをページングすることを強くお勧めします。

まず、ストアド プロシージャを次のように変更する必要があります。

ALTER PROCEDURE [dbo].[SomeTable_GetPagedResults] 
( 
        @StartRowIndex      int, 
        @MaximumRows        int 
) 

AS 
SET NOCOUNT ON 

Select 
    RowNum, 
    [ID], 
    [foo],
    [bar]
From 
    (Select 
        [ID], 
        [foo], 
        [bar], 
        Row_Number() Over(Order By [ID] Desc) As RowNum 
        From dbo.[SomeTable] t) 
As DerivedTableName 
Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows) 

これで、ページング可能なクエリができました。

また、完全な行数を取得するクエリも必要です。

ALTER PROCEDURE [dbo].[SomeTable_GetRowCount] 

AS 
SET NOCOUNT ON 

return (Select Count(ID) As TotalRecords From SomeTable) 

ページを変更するたびにグリッドをバインドします。

protected void gridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
  gridView1.PageIndex = e.NewPageIndex;
  BindGrid(); // this is whatever method you call to bind your data and execute your stored procedure.
}

そして、このBindGrid()メソッドは 2 つのストアド プロシージャを呼び出します (1 つは完全な行数を取得するためのもので、もう 1 つは現在のページに関する結果を取得するためのものです)。

追加資料

于 2013-07-31T19:51:11.120 に答える
2

データベースのページングを開始する必要があります。

これには、カスタム ソート、カスタム フィルタリング、およびカスタム ページングの作成が含まれますが、17,000 行すべてではなく、DB から一度に 1 ページ分のデータのみを取得するため、コードのパフォーマンスが劇的に向上します。一度に。

私はこれを、数十万件のローンを表示、ソート、およびフィルタリングするように設計された銀行アプリケーションに実装しました。答えは複雑すぎて簡単な例を挙げることはできませんが、データベースのページングについて調べることから始めてください。LINQ を使用すると、ページングを最も簡単に実装するためのシンプルな方法Takeが得られます。Skip

于 2013-07-31T20:10:02.627 に答える
1

特に頻繁に更新されない場合は、Web サーバーでクエリをキャッシュすることを検討する必要があります。そうすれば、すべてのクライアントは容赦なくデータベースにアクセスするのではなく、単純にキャッシュをサーフすることができます。

このSOの質問を参照してください

于 2013-07-31T19:50:05.640 に答える
0

実際、ユーザーが 17k レコード全体を一度に見ることができなくても、17k レコードを 1 回ロードするだけでは役に立ちません。DataTable.Mergeチャンクでレコードをロードし、新しいフェッチされたデータを前のデータに追加するのに役立つ機能とともにページネーションを使用することをお勧めします。簡単なテストを行ったところ、解決策が見つかりました。これを試してみてください。

于 2014-03-30T21:52:43.983 に答える