2012-04-23 5 views
0

SQL 저장 프로 시저에 간헐적으로 문제가 발생하여 SQL dB에서 제품을 검색합니다. 우리는 약 3500 명의 활성 사용자를 보유하고 있으며 일반적으로 약 15-30 명의 사용자가이 절차를 사용하여 한 번에 로그인했습니다. 지난 주 동안, 나는 아래처럼 시간 제한 만료 된 메시지를 받고있다 :SQL 제한 시간 경과 - 간헐적 인 문제

System.Data.SqlClient.SqlException을 : 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. 시스템에서 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj)에서 System.Data.SqlClient.SqlInternalConnection.OnError에서 System.Data.SqlClient.SqlConnection.OnError (SQLEXCEPTION 예외 부울 breakConnection) (SQLEXCEPTION 예외 부울 breakConnection)에서 .Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet, bulkCopyHandler, TdsParserStateObject stateObj), System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() (시스템) .Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader 개체 DS, runBehavior runBehavior, 문자열 resetOptionsString)에는 System.Data.SqlClient.SqlCommand에서 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds에서 (CommandBehavior를 cmdBehavior, runBehavior runBehavior, 부울 returnStream, 부울 비동기). RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, 부울 returnStream, 문자열 메터 OD, System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior를 cmdBehavior, RunBehavior runBehavior, System.Data에서 System.Data.SqlClient.SqlCommand.ExecuteReader에서 부울 returnStream 문자열() 메소드 CommandBehavior를 동작 문자열 법)에 DbAsyncResult 결과). System.Data.Common.DbDataAdapter.FillInternal에서 SqlClient.SqlCommand.ExecuteDbDataReader System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior를 동작)에서 (CommandBehavior를 동작) (데이터 집합 데이터 셋의 DataTable [] datatables, INT32 startRecord , INT32을 MaxRecords, System.Data.Common.DbDataAdapter에서 System.Data.Common.DbDataAdapter.Fill (데이터 집합 데이터 집합 INT32 startRecord, INT32을 MaxRecords, 문자열 srcTable,에 IDbCommand 명령, CommandBehavior를 동작)에서 문자열 srcTable,에 IDbCommand 명령, CommandBehavior를 동작) .Fill (DataSet dataSet, String srcTable), Clear.PopulateRegularLineList (Int32 PageIndex) e : \ Websites \

는 SP가 (드롭 다운 상자를 선택하면 이상) 한 번에 12 개 제품을 찾아온다, 그리고 수동으로 실행할 때 빠르게 실행됩니다. 지난 주 내내 다른 사용자와 다른 시간대에 20 번이나 일어난 일이있었습니다. 프로 시저를 실행하거나 테스트 계정을 사용하여 사이트를 탐색 할 때 오류를 다시 만들 수 없었습니다. 나는 NOLOCK을 추가하거나 커맨드 타임 아웃을 증가시키는 것이 문제를 해결할 수 있다고 읽었지만 근본적인 문제 (NOLOCK의 열악한 데이터 함의는 말할 것도 없다)에 대한 해결책이 아니라 단지 빠른 은폐입니다.

제품을 표시하는 SQL의 부분은 여기에 있습니다 :

INSERT INTO @Products (WWHEAD, WWPROD, WWDESC, CTNQTY, PRC1, PRC4, [FILENAME], DPQIS, QTYL, FileReference, LineId, Price5, PriceGroup, Dimensions)     
(SELECT A.WWHEAD, A.WWPROD, A.WWDESC, A.CTNQTY, 
     CASE WHEN @IsPrice5 = 5 THEN LTRIM(RTRIM(A.Price5)) ELSE LTRIM(RTRIM(A.PRC1)) END,   
     CASE WHEN @IsPrice5 = 5 THEN A.Price5 ELSE A.PRC4 END, 
     [FILENAME], 
     (CAST((DPQIS-DPALOC) AS INT)), 
     D.QTY, 
     'WebImage', 
     LineId, 
     CASE WHEN @IsPrice5 = 5 OR A.Price5 = A.PRC4 THEN NULL ELSE A.PRICE5 END, 
     LTRIM(RTRIM(PG.PriceCode)) + ' ' + LTRIM(RTRIM(PG.GroupDesc)) + ' ' + LTRIM(RTRIM(PG.DiscDesc)), 
     Dimensions 
FROM PRODUCTS A 
     INNER JOIN STOCK C ON A.WWPROD = C.DPPROD AND DPDEPO = 'CH' 
     INNER JOIN PROD_COPY W ON A.WWPROD = W.WWPROD 
     INNER JOIN PRODGRP PD ON PD.GPNUM = W.WWPRGP 
     LEFT OUTER JOIN ORDERS D ON D.OrderID = @OrdId AND A.WWPROD = D.ProdCode 
     LEFT OUTER JOIN PRGRP PG ON A.WWPCGP = PG.PriceCode 
     LEFT OUTER JOIN PRODALT_GRP X ON X.ProdCode = A.WWPROD 
WHERE A.WWBONS = 'B' 
AND  A.WSID = 'WS' 
AND  (LTRIM(RTRIM(A.WWHEAD)) = LTRIM(RTRIM(@CatHead)) OR ISNULL(@CatHead, '0') = '0') 
AND  (LTRIM(RTRIM(A.WWSBHD)) = LTRIM(RTRIM(@CatSub)) OR ISNULL(@CatSub, '0') = '0')  
AND  (LEFT(LTRIM(RTRIM(A.WWPRGP)), 2) = LTRIM(RTRIM(@BrandT1)) OR ISNULL(@BrandT1, '0') = '0') 
AND  (LTRIM(RTRIM(A.GRPTR2)) = LTRIM(RTRIM(@BrandT2)) OR ISNULL(@BrandT2, '0') = '0') 
AND  (LTRIM(RTRIM(A.GRPTR3)) = LTRIM(RTRIM(@BrandT3)) OR ISNULL(@BrandT3, '0') = '0')   
AND  X.AltGroupCode = @ProductFilter 
AND  A.PRC1 BETWEEN @MinValue AND @MaxValue 
AND  A.WWHEAD <> 'B20' 
AND  (A.WWDESC Like ('%' + @SearchString + '%') OR A.WWPROD LIKE ('%' + @SearchString + '%') 
    OR A.WWPROD IN (SELECT Prodcode FROM WDS..Prod_Keywords INNER JOIN WDS..Keywords ON KeyID = KeywordID WHERE Keyword LIKE ('%' + @SearchString + '%')))       
AND  A.WWBRN NOT IN (SELECT * from WDS.dbo.f_BrandExclusionList(@WebUserName, NULL)) 
AND  CAST(CASE WHEN NDATMM = '' THEN '01' ELSE NDATMM END + '-' 
      + CASE WHEN NDATDD = '' THEN '01' ELSE NDATDD END + '-' 
      + CASE WHEN NDATYY = '' THEN '1900' ELSE NDATYY END AS DATETIME) BETWEEN @threemonths AND GETDATE() 
GROUP BY PD.GPSORT, A.WWHEAD, A.WWPROD, A.WWDESC, A.CTNQTY, A.PRC1, A.PRC4, [FILENAME], C.DPQIS, C.DPALOC, D.QTY, 
     LineId, A.Price5, PG.PriceCode, PG.GroupDesc, PG.DiscDesc, A.WWSBHD, A.WWBRN, 
     A.GRPTR2, A.GRPTR3, A.WWSORT, A.WWPCGP, Dimensions 
HAVING ((A.PRC1 > 20.00 AND ((DPQIS-DPALOC) > 2)) OR (A.PRC1 <= 20.00 AND ((DPQIS-DPALOC) > 8)))) 
ORDER BY PD.GPSORT, A.WWBRN, A.GRPTR2, A.GRPTR3, A.WWPCGP DESC, A.WWHEAD, A.WWSBHD, A.WWSORT, A.WWPROD 

어떤 아이디어? 미리 감사드립니다.

답변

0

관련 코드가 있습니까? 얼마나 많은 동시 연결이 만들어지고 실행이 완료된 후 연결이 닫히고 있습니까?

+0

안녕하세요, 원래 질문에 SQL 코드를 추가했습니다. 감사 – odinel