2017-11-21 3 views
4

나는 그런 생각을 가지고 있습니다 (좋지 않거나 좋지 않습니다). 난 reglament에 의해 SQL 서버에 연결하고 응용 프로그램에 일부 데이터를 가져 오는 유틸리티가 있습니다. 데이터는 간단합니다 (2 개의 varchar 텍스트 속성). 데이터 수는 3 백만 행입니다. 그래서, 제 어플리케이션은 네트워크를 집중적으로 사용합니다. SQL DataReader에 의해 네트워크 대역폭 사용을 프로그래밍 방식으로 줄이거 (제한, 제한 등 ...) 수 있습니까? 더 천천히 작동 시키지만 서버 나 클라이언트 모두에 스트레스를주지 마십시오. 이 아이디어가 좋은가요? 그렇지 않다면 어떻게해야합니까? 여기SQL DataReader 네트워크 사용 한도

지금까지 코드입니다 :

using (SqlConnection con = new SqlConnection("My connection string here")) 
{ 
    con.Open(); 
    using (SqlCommand command = new SqlCommand(query, con)) 
    {       
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return new MyDBObject() 
       {        
        Date = (DateTime)reader["close_date"],         
        JsonResult = (string)reader["json_result"] 
       }; 
      } 
     } 
    } 
} 
+1

예 - 데이터 판독기를 사용하면 클라이언트 측의 모든 데이터를 구체화 할 필요없이 대형 데이터 세트를 지연 테스트 할 수 있습니다. 데이터 액세스에서 async/await를 사용하면 yield return generator를 별도의 함수 (또는 로컬 함수)로 옮겨야 할 가능성이 높습니다. [Example here] (https://stackoverflow.com/a/47376646/314291) – StuartLC

+1

클라이언트에서 효과적으로 조절할 수 없습니다. 그렇게하면 서버 끝의 잠금과 버퍼를 잠그고 행을 생성 할 수없는 스레드를 차단합니다. "작동"한다고하더라도 대역폭을 줄이면 서버의 대기 상태 통계는 스파이크는 'ASYNC_NETWORK_IO' 대기를 많이 보게 될 걱정되는 DBA로부터주의를 끌 수 있습니다. 호출 당 가져 오는 데이터의 양을 줄여 다른 쿼리를위한 여유 공간을 확보 할 수 있지만 가능한 빨리 가져 오는 모든 데이터를 항상 처리합니다. –

답변

4

서버 버퍼의 데이터를 만들기 또는 실제로 크게 서버에 부하가 증가 될 수 이상 열린 조회를 개최하지만, 궁극적으로 무엇을 할 수있는 유일한 방법 다시 말해서 "페이징"을 쿼리에 적용하고 페이지 간 일시 중지를 사용하여 연속 페이지에서 데이터에 액세스해야합니다. 페이지는 여전히 매우 클 수 있습니다 (예 : 100k). SQL Server에서 OFFSET/FETCH으로 비교적 쉽게 얻을 수 있습니다.