DataSet和SqlDataReader的比較的文章和文章網上已經很多,我也看了很多前輩的隨筆.自己在面試和實際工作中也遇到這樣的問題.但是始終是沒深入進行學習.最近在工作空閑之餘,特地查閱了一些文章,也包括msdn的官方文檔.自己建立資料庫和測試程式,對DataSet和SqlDataReader做了比較.
首先關於兩者比較主流的觀點就是:
1.DataReader使用時始終佔用SqlConnection,線上操作資料庫.DataSet則是將資料一次性載入在記憶體中.支援資料庫訪問的中斷連線模型.
2.DataReader每次只在記憶體中載入一條資料,節約記憶體.DataSet將資料全部載入在記憶體中.比較消耗記憶體.
3.DataReader單向唯讀.DataSet支援查詢\修改\刪除等操作,比較靈活.
4.DataReader與 SqlCommand搭配.DataSet與DataAdapter 結合使用.
為什麼會這樣呢?我們就來分析一下具體的原因.查看一下msdn關於 兩者的不同描述:
1>SqlDataReader 類提供一種從 SQL Server 資料庫讀取行的只進流的方式。無法繼承此類。命名空間:System.Data.SqlClient程式集:System.Data(在 System.Data.dll 中).可以使用 ADO.NET DataReader 從資料庫中檢索唯讀、只進的資料流。查詢結果在查詢執行時返回,在並儲存在用戶端的網路緩衝區中,直到您使用 DataReader 的 Read 方法對它們發出請求。使用 DataReader 可以提高應用程式的效能,原因是它只要資料可用就立即檢索資料,並且(預設情況下)一次只在記憶體中儲存一行,減少了系統開銷。
2>DataSet 對象是支援 ADO.NET 的斷開式、分布式資料方案的核心對象。DataSet 是資料的記憶體駐留表示形式,無論資料來源是什麼,它都會提供一致的關係編程模型。它可以用於多種不同的資料來源,用於 XML 資料,或用於管理應用程式本地的資料。DataSet 表示包括相關表、約束和表間關係在內的整個資料集。下圖將顯示 DataSet 物件模型。
從上面的描述可以看出,DataReader和DataSet具有不同的結構模型.在資料的方式處理上也存在顯著的差別.SqlDataReader 會避免建立不必要的對象或複製不必要的資料.DataSet 可以表示完整的資料模型,包括表格、約束條件和表關係.在對象的建立和銷毀等環節需要消耗更多的資源,因此在效能上也稍顯遜色.因此很多文章得出的結論也是在只進行讀資料操作的情況下,DataReader的效能要強於DataSet.但是很多文章都沒有相應的測試,就盲目下結論.
但是好奇心理的驅使使我很想來做個實驗來驗證一下這個結論,到底DataReader比DataSet在查詢資料的時候,效能會不會勝出,如果前者更優的話那麼會超出多少?我自己寫了個小程式,自己建立的資料庫進行了實驗. 實驗測試環境如下:
硬體:
| CPU |
Intel T2300 1.66GHz |
| 記憶體 |
Kingston DDR2 667 1G |
| 硬碟 |
80G 5400轉 8m |
軟體:
| 作業系統 |
Windows Server 2003 |
| 資料庫系統 |
SQL Server 2005 Enterprise |
| 資料規模 |
1000000條資料 |