簡體   English   中英

ASP.NET ViewState vs Session,數據量大

[英]ASP.NET ViewState vs Session, big amount of data

我有一個 WebUserControl,它從 SQL 獲取記錄並存儲在 ViewState 中,到目前為止效果很好。 但現在我有一個包含 100k+ 記錄的數據集,我注意到在每次回發時 XHR 請求下載所有數據並且速度非常慢,如果我將數據存儲在 Session 中則不會發生這種情況,所以我會問是否可以存儲這些數據量在 session 變量中?

我的測試:

  1. Viewstate: ViewState 網絡響應
  • 第一個請求讀取數據並存儲在 ViewState 中(時間:11 秒,大小:119MB)
  • 第二個請求是一個通用的回發,對視圖狀態沒有任何作用,盡管如此,它還是需要很長時間才能收到回復並下載大量數據(時間:15s,大小:119MB)
  • 總計: 26s,238MB
  1. Session: Session網絡響應
  • 第一個請求讀取數據並存儲在Session里面(Time: 7s, Size: 123kB)
  • 第二個請求是一個通用的回發,它對 Session 不做任何事情並且速度很快(時間:60 毫秒,大小:122kB)
  • 總計: 7 秒,244kB

在這個測試之后,我的意思是,將數據存儲在 Session 中而不是 ViewState 中似乎要好得多,檢索數據更快並且為每個請求下載更少的數據,但我不完全確定這是一個好的實踐,也許我忽略了執行此操作的更好方法。 我希望這是清楚的,英語不是我的第一語言對此感到抱歉。

你說得很對。 事實上,我什至發現整個頁面大小可以超過 web 配置中設置的回發限制。

但是,有兩個重要問題:

正如評論中指出的那樣,用那么多數據加載 session() 也是一個非常糟糕的主意。

接下來:

您真的需要在 session() 中存儲那么多數據嗎? 雖然您指出了巨大的性能提升 - 但您仍然在 web 服務器上施加了非常大的負載。 這將耗盡 session() memory,更糟糕的是,如果使用 sql 基於服務器的會話,那么您將在 sql 服務器上施加相當大的負載(該數據塊由 .net 序列化,然后保存到 sql 中的一行服務器 session state - 這將再次成為 sql 服務器上的非常困難的負載 - 甚至“序列化”到 session 的時間也需要一些時間)。

頁面上真正可以顯示多少行數據? 30頂?

現在,對於幾 1000 行,我什至不敢使用 ViewState。 它只會加載並使 web 頁面膨脹太多。

並且只說 1000 行,以及網格視圖(或列表視圖)的數據分頁,那么這就可以工作。

但是,超過 1000 行?

您甚至還沒有關閉並在同一個 pl.net 上加載那 100k 行。 這簡直是不可能的。

想想谷歌,甚至任何其他軟件 - web 或桌面。

我們不會下載整個 inte.net,然后說你是否使用 ctrl-f 搜索巨大的數據頁面。

這也一樣。

那么,這究竟意味着什么?

您必須轉儲內置數據分頁器,並編寫自定義代碼。

您可以使用最新版本的 sql 服務器(2012 年起)可以使用所謂的 sql 服務器數據分頁。 所以,這意味着我們想讓 SQL 服務器進行數據分頁,而不是加載整個大象數據,然后嘗試對該數據進行分頁。 嘗試一次處理這么多數據是不切實際的——至少從 UI 的角度來看是這樣。

(無論如何,用戶如何一次處理 100,000 行 - 這真的不可能。

這意味着,如果您的頁面有 30 行? 好吧,那么您甚至不需要 ViewState 或 session。您只需從 100,000 行中拉出 30 行,您的性能就會立竿見影。 您的頁面將加載(和數據頁面)不到一秒鍾的時間!!!

你減少了服務器上巨大的 memory 使用,你也如前所述,減少了視圖 state 的大小。(你只說了 30 行 - 這樣,你甚至發現讓 gridview/list 視圖繼續使用視圖 state(他們擁有的自動視圖 state)。

因此,查看 sql 服務器端分頁的概念。 您仍然可以將看起來像數據分頁器的東西拼湊在一起,並且可以獲取(計算)該表中的總行數,但您只能說一次拉出 30 行。

這里概述了這是如何工作的:

在 SQL 服務器中對結果進行分頁的最佳方法是什么

如果您沒有 sql 服務器 2012 或更高版本,上面的鏈接和帖子概述了一些替代方法。 我和 position 認為使用 2012 年更新的“分頁”功能是簡單的方法,盡管上面發布的一些解決方案被認為更快。

所以,你必須在這里建立一個尋呼機。 您可以自己滾動,但歸根結底,內置的分頁系統實際上只是為了獲得更好的 UI 性能,並且實際上僅適用於大約 1000 行數據。 之后,您需要采用分頁系統,您的軟件和用戶會因此喜歡您 - 因為一切都會像您單擊鼠標一樣快速響應和運行。 您甚至不需要為此采用 ajax 調用,但您必須減少從 SQL 服務器拉取的行 - 減少到 30 或 20 或您的網格一次顯示的行數。

暫無
暫無

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

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