[英]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,它會給你簡單的Take
和Skip
方法來實現最簡單的分頁。
您應該考慮在 Web 服務器上緩存查詢,尤其是在不經常更新的情況下。 這樣,所有客戶端都可以簡單地瀏覽緩存,而不是無情地訪問數據庫。
看到這個問題
真的,即使用戶不能一次看到整個 17k 記錄,一次加載 17k 記錄也沒有用。 我建議您將分頁與DataTable.Merge
函數一起使用,這有助於以塊的形式加載記錄並將新獲取的數據附加到前一個中。 我只是做了一個快速測試並找到了解決方案。 試試這個。
沒有解決方案分頁很慢並且會一次又一次地調用數據庫,所以你需要把
<style>.body{display:none;}</style>
頁面的開頭和頁面的結尾
<style>.body{display:block;}</style>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.