簡體   English   中英

將大數據集加載到 c# GridView 中的性能問題

[英]Performance Issues loading large data set into c# GridView

行,

一直在我的 GridView 中測試相對較小的數據集,並且一切正常。 但是,我現在已經使用了適當的 UAT 並嘗試將 17,000 條記錄加載到我的網格中,這基本上使我的網絡應用程序陷入停頓。

基本上,用戶登錄,並在驗證后加載所有數據網格,其中之一包含 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 處理這個問題。

在一個查詢中加載 17,000 條記錄會讓您喪命。 我強烈建議對您的 gridview 進行分頁。

首先,您需要按如下方式更改您的存儲過程。

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()方法將調用您的兩個存儲過程(一個獲取完整的行數,另一個獲取與當前頁面相關的結果)

補充閱讀

您需要建立數據庫分頁。

這將涉及創建自定義排序、自定義過濾和自定義分頁,但它會顯着提高代碼的性能,因為您一次只能從數據庫中檢索一頁數據,而不是所有 17,000 行一次。

我在一個銀行應用程序中實現了這一點,該應用程序旨在顯示、排序和過濾數十萬筆貸款。 答案太復雜,無法舉一個簡單的例子,但首先要研究數據庫分頁。 使用 LINQ,它會給你簡單的TakeSkip方法來實現最簡單的分頁。

您應該考慮在 Web 服務器上緩存查詢,尤其是在不經常更新的情況下。 這樣,所有客戶端都可以簡單地瀏覽緩存,而不是無情地訪問數據庫。

看到這個問題

真的,即使用戶不能一次看到整個 17k 記錄,一次加載 17k 記錄也沒有用。 我建議您將分頁與DataTable.Merge函數一起使用,這有助於以塊的形式加載記錄並將新獲取的數據附加到前一個中。 我只是做了一個快速測試並找到了解決方案。 試試這個。

沒有解決方案分頁很慢並且會一次又一次地調用數據庫,所以你需要把

<style>.body{display:none;}</style>

頁面的開頭和頁面的結尾

<style>.body{display:block;}</style>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM