У меня есть метод, который считывает данные с использованием SqlDataReader и выход возвращает IEnumerable и т.д .:Take (10) vs 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 сервера к клиенту, даже если DataReader читает только несколько строк (до тех пор, пока соединение открыто) - следует ли мне избегать подхода Take(10)
из-за того, что дополнительные данные передаются в любом случае клиенту, или это будет преждевременная оптимизация, чтобы избежать этого (потому что код возврата доходности закроет соединение после он читает 10 строк, а затем передача данных все равно остановится)?
'ORDER BY CreationDate DESC'? – jarlh
Это не была бы преждевременная оптимизация. Возьмите из базы данных только то, что вам действительно нужно. Нет смысла выбирать 10 000 клиентов, когда вам нужно всего 10. –
Вы неправильно истолковываете то, что говорит этот пост. Весь результирующий набор * не * передается клиенту, если вы прекратите чтение, хотя некоторые строки уже могут быть буферизованы. 'SqlDataReader' не« читает вперед »за пределами сети. Причина, по которой вы по-прежнему хотите отправить «TOP (10)» на сервер базы данных в большинстве случаев и почему это не является преждевременной оптимизацией, заключается в том, что оптимизатор может создать более эффективный план, если он знает, что вам нужно только 10 строк, а не чтение всей таблицы (если ничего другого, запрос будет выделять меньше памяти заранее). –