2012-09-04 3 views
2

SQL 데이터를 C# 응용 프로그램으로 가져 오는 일부 특수한 동작을 확인했습니다. 데이터 세트 xsd를 사용했지만 시간이 초과되었습니다. 그런 다음 다른 작업을 위해 데이터 테이블을 생성하고 반환하는 클래스가 이미 있으므로 접근 방식을 변경했습니다. 너무 시간 초과되었습니다.SqlDataAdapter.Fill 명령을 사용한 SQL CPU 최고점

SSMS에서 Activity Monitor를 열어서 코드가 실행될 때 SQL에서 어떤 일이 벌어지고 있는지 알아보고 실행 방법을 알아 채면 SQL Server가 100 % CPU를 피크로 채우고 채우기 명령을 실행하는 것으로 나타났습니다. 명령이 취소 될 때까지 거기에서. 이것은 240Ghz 프로세서와 30GB RAM을 갖춘 좋은 서버입니다. 쿼리는 정확하지는 않지만 SSMS에서 3 초 이내에 100k 행을 반환합니다.

public DataTableOperations (string strconnection, string strSelect,string tablename) 
{ 
     SqlConnection c = new SqlConnection(strconnection); 
     connection = c; 
     SqlDataAdapter da = new SqlDataAdapter(strSelect, connection); 
     DataSet ds = new DataSet(); 
     //added this to see what would happen. 
     da.SelectCommand.CommandTimeout = 0; 
     connection.Open(); 
     da.Fill(ds, tablename); 
     connection.Close(); 
     Datatable = ds.Tables[tablename]; 
     _disposed = false; 
    } 

임 문제가 발생할 수 있습니다 무엇에 대한 단서를 찾고,하지 : 여기

 public DataTable UKDataRefresh() 
    { 
     UKREFRESH.UKNewContactsDataTable dt = 
      new UKREFRESH.UKNewContactsDataTable(); 
     UKREFRESHTableAdapters.UKNewContactsTableAdapter ta = 
      new UKREFRESHTableAdapters.UKNewContactsTableAdapter(); 

     ta.Connection.ConnectionString += ";Password = xxxxxx;"; 

     try 
     { 
     ta.Fill(dt, global::SilverPopTransfer.Properties.Settings.Default.UKDATELASTACTION); 

     } 
     catch (SqlException) 
     { 

      throw; 
     } 

     return dt; 

    } 

는 즉시 그것을 구축을위한 내 코드입니다 : 여기

는 데이터 집합 내 코드입니다 완전한 해결책.
부수적으로 게시하기 전에 기존 콘솔 응용 프로그램에서 비슷한 기능을 실행했는데 오류없이 연결되어 실행되었습니다. 쿼리가 거의 동일했습니다.

유일한 차이점은 기존 응용 프로그램의 경우 통합 보안을 사용하지만이 경우 사용자와 암호를 지정한다는 것입니다. I 이 로그인 자격 증명을 확인했습니다.

답변

0

실행 전에 인덱스와 set nocount on을 확인하십시오. SSMS 성능은 좋은 성능 지표가 아닙니다. 부분적인 데이터 만 가져오고 비동기 적으로 실행됩니다. 데이터의 작은 하위 집합을 호출하거나 테이블을 채우지 않고 쿼리를 실행 해보십시오. 그것은 병목 일 수 있습니다.

선택 매개 변수를 실행하는 경우 SQL Server는 sp_execute을 사용하여 실행하고 서버는이를 컴파일하여 CPE 피크를 생성합니다.

+0

감사합니다. 코드를 살펴보고 제안한 내용을 시도했습니다. 'SqlCommand cmnd = new SqlCommand (strSelect, connection); CommandBehavior behave = CommandBehavior.Default; connection.Open(); IAsyncResult 결과 = cmnd.BeginExecuteReader (동작); using (SqlDataReader reader = cmnd.EndExecuteReader (result)) {DisplayResults (reader); }'이전과 같은 결과입니다. 즉 CPU의 엄청난 급증 및 ** 많은 프로세스 ** 트리거. –

+0

아마 매개 변수를 사용하고 있습니까? 내 편집을 확인하십시오. –

관련 문제