我有使用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行而不是读取整个表格(如果没有其他,查询将提前分配更少的内存)。 –