2013-05-04 3 views
0

많은 쿼리를 통과 할 때마다 내 쿼리가 멈추는 것 같습니다.SQL 쿼리가 일시 중지됩니다.

 status_text.Text = "Check existing records..."; 
     status_text.Refresh(); 
     using (StreamReader reader = new StreamReader(df_text_filename)) 
     { 
      using (StreamWriter writer = new StreamWriter(df_text_filename + "_temp")) 
      { 
       while ((product = reader.ReadLine()) != null) 
       { 
        if (product != _aff_svc.DFHeaderProd) 
        { 
         df_product = _product_factory.GetProductData(_vsi, product); 
        } 
        status_text.Text = "Checking for existing record of vendor record ID " + df_product.SKU; 
        status_text.Refresh(); 
        if (_pctlr.GetBySKU(df_product.SKU) != null) 
        { 
         continue; 
        } 
        writer.WriteLine(product); 
        Application.DoEvents(); 
       } 
       writer.Close(); 
      } 
      reader.Close(); 
     } 
     System.IO.File.Delete(df_text_filename); 
     System.IO.File.Move(df_text_filename + "_temp", df_text_filename); 

코드는 이렇게 빨리, 신속 두 번째 또는 대해 다른 열 개 기록을하지 일시 중지는 GetBySKU을 통해 약 10 배를 실행합니다. 이것은이 특정 쿼리뿐만 아니라 내 프로세스 전체에서 발생합니다.

또한 Application.DoEvents() 화재 여부와 관계없이 발생합니다.

다른 문제는 일관성이 없다는 것입니다. 몇 시간 동안 이런 식으로 일할 수 있습니다. 그런 다음 갑자기 루프가 예상대로 작동합니다.

내 SQL 서버가 프로그램과 동일한 시스템에서 실행 중입니다.

이 동작을 완화하기 위해 리소스를 서버에 할당했지만 아무것도 발견하지 못했습니다.

+1

[SQL Server 프로파일 러] (http://msdn.microsoft.com/en-us/library/ms181091.aspx)를 사용해 보셨습니까? 문제가 응용 프로그램 또는 데이터베이스 측면에 있는지 여부에 대한 단서를 제공 할 수 있습니다. – HABO

+0

"제품이 null이 아님"경우 UI를 업데이트하지 않고 ('DoEvents'를 건너 뜁니다.)'continue'를 사용합니다. - 여기에 "stall"이 실제로는 단지 블록 일 가능성이 있습니까? 이미 마쳤어? SQL에 책임을 묻기 위해 어떤 프로파일 링을 했습니까? SQL 시간을 로깅하고 있습니까? 그렇지 않다면 먼저 해보십시오. 여기서 "SQL 쿼리"가 'GetBySKU'라고 가정합니다. –

+3

또한,'Application.DoEvents'를 사용할 때마다 CPU가 새끼 고양이를 죽입니다. 단지 sayin '입니다. –

답변

1

마치 프로그램이 제품 정보를 텍스트 파일로 구문 분석 한 것처럼 보이고 잠시 후 구문 분석하면 루프 두 개의 SQL 쿼리를 실행하고 있습니다. 루프 내에서 SQL 라운드 트립을 만드는 것은 거의 항상 나쁜 생각입니다.

대신 파일을 분석하고 모든 제품 아이디어를 수집하고 파일을 닫은 다음 SQL에 a/many TVPs (table valued parameters)을 전달하여 sproc에서 필요한 모든 데이터를 반환하는 방법을 살펴 보았습니다. 많은 테이블.

편집 : 주석 처리에서 파일이 매우 많음을 언급했습니다. SQL 작업 일괄 처리를 고려해 볼 수 있습니다.

또한 SQL을 조정하지 않으면 더 많은 데이터가 쓰여질수록 지속적으로 속도가 느려집니다. 인덱스, 쿼리 계획 등을 분석하는 데 충분한 정보가 없지만 데이터 세트가 커짐에 따라이를 살펴보십시오.

+0

불행히도 데이터 파일은 현재 시스템에서 그렇게하기에는 너무 무겁습니다. GetProductData는 SQL 쿼리가 아니며 단지 db와 비교할 텍스트 데이터에서 개체를 만듭니다. –

+0

내가 이것을하는 이유는 힘이 내가있는 곳에서 자주 나가기를 좋아하기 때문입니다.이 프로세스는 몇 시간이 걸릴 수 있으며 다시 시작하기 전에 이미 처리 된 내용을 확인하고 싶습니다. –

+0

한 번에 100 개까지 배치 할 수 있습니다 ... – bryanmac

0

나중에 배치 솔루션에서 작업하겠습니다. 그러나 이전 코드보다 훨씬 빠르게 작동합니다. 전혀 멈추지 않습니다.

  List<Product> _prod_list = new List<Product>(); 
      _prod_list = ProductDataFactory.GetProductListByVendor(vendor_name); 
      if (_prod_list.Count() > 0) 
      { 
       using (StreamReader reader = new StreamReader(df_text_filename)) 
       { 
        using (StreamWriter writer = new StreamWriter(df_text_filename + "_temp")) 
        { 
         while ((product = reader.ReadLine()) != null) 
         { 
          if (product != _aff_svc.DFHeaderProd) 
          { 
           df_product = _product_factory.GetProductData(_vsi, product); 
          } 
          if (_prod_list.Find(o => o.SKU == df_product.SKU) != null) 
          { 
           continue; 
          } 
          writer.WriteLine(product); 
         } 
         writer.Close(); 
        } 
        reader.Close(); 
       } 
       System.IO.File.Delete(df_text_filename); 
       System.IO.File.Move(df_text_filename + "_temp", df_text_filename); 
      } 

제품 개체 목록을 가져 와서 기존 레코드가 있으면 쿼리합니다. 그렇지 않다면, 물론 모든 과정을 건너 뜁니다. 루프에서 DB를 칠 필요도 없습니다.

감사합니다.

+0

Heh, 방금 내 가장 큰 2.6GB 소스 파일 테스트를 실행했습니다. 보통 하루 종일이 부분을했습니다. 그것은 30 분 이내에 끝났습니다! –

관련 문제