나는 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 명) 고객이 필요로 가정 할 수 있습니다. 나는 this post에 전체 결과 집합을 따라하는 것은 DataReader를 읽는 경우에도 클라이언트에 SQL 서버로부터 전송되는
SELECT TOP 10 FROM Customers ORDER BY CreationDate DESC
내 SQL
LoadCustomers.Take(10)
을하거나 SQL 매개 변수로 (10)를 통과 할 수있다 단 몇 행 (연결이 열려있는 한) - 어쨌든 클라이언트에 전송되는 여분의 데이터 또는이를 피하기위한 조기 최적화로 인해 Take(10)
접근 방식을 피해야합니까? (yield 리턴 코드가 그것은 10 행을 읽고 데이터 전송은 어쨌든 멈출 것입니까?)
'주문서 작성일 DESC'? – jarlh
너무 조숙 한 최적화가 아닐 것입니다. 실제로 필요한 것만 데이터베이스에서 가져옵니다. 10만이 필요할 때 10,000 명의 고객을 선택하는 것은 의미가 없습니다. –
당신은 그 게시물이 말하는 것을 오해하고 있습니다. 일부 행은 이미 버퍼링되어있을 수 있지만 읽기를 중지하면 전체 결과 집합이 클라이언트에 전송되지 않습니다. 'SqlDataReader'는 네트워크를 넘어서는 "미리 읽기"를하지 않습니다. 대부분의 경우 데이터베이스 서버에'TOP (10) '을 보내려는 이유와 조기 최적화가 아닌 이유는 최적화 도구가 10 행만을 필요로한다는 것을 안다면 더 효과적인 계획을 세울 수 있기 때문입니다 전체 테이블을 읽습니다 (다른 것이 없으면 쿼리는 미리 적은 메모리를 할당합니다). –