我有使用SqlDataReader的讀取數據和產量返回一個IEnumerable的方法,例如:採取(10)與TOP 10與SqlDataReader?
IEnumerable<string> LoadCustomers()
{
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return rdr.GetString(0);
}
}
}
現在讓我們假設我只需要最新的10個客戶。我可以做
LoadCustomers.Take(10)
或通過10作爲參數傳遞給SQL,讓我的SQL
SELECT TOP 10 FROM Customers ORDER BY CreationDate DESC
根據this post整個結果集正在從SQL Server發送到客戶端,即使DataReader的讀取只有少數行(只要連接處於打開狀態) - 我應該避免使用Take(10)
方法,因爲無論如何,這些額外的數據都會傳輸到客戶端,或者過早地進行優化以避免它(因爲yield return代碼會在連接之後關閉連接它讀取10行,然後數據傳輸將停止)?
'ORDER BY CreationDate DESC'? – jarlh
這不會是不成熟的優化。從數據庫中只取得你實際需要的東西。當你只需要10個客戶時,選擇10,000個客戶是沒有意義的。 –
你在誤解那篇文章的內容。如果您停止閱讀,整個結果集* *不會傳輸到客戶端,儘管某些行可能已被緩衝。 'SqlDataReader'不會超出網絡的「預讀」。在大多數情況下,仍然希望將'TOP(10)'發送到數據庫服務器的原因以及爲什麼這不是過早的優化,是因爲如果優化程序知道您只需要10行而不是讀取整個表格(如果沒有其他,查詢將提前分配更少的內存)。 –