문제

SQL Server Management Studio에서 실행하는 데 1 초가 걸릴 때 (.NET 1.1)를 실행하는 데 60 초가 걸리는 9 개의 열, 89 행이 60 초가 걸리는 저장 프로 시저가 왜? 로컬 컴퓨터에서 실행 중이므로 네트워크 대기 시간이 거의 없거나 빠른 개발 기기

Dim command As SqlCommand = New SqlCommand(procName, CreateConnection())
command.CommandType = CommandType.StoredProcedure
command.CommandTimeout = _commandTimeOut
Try
   Dim adapter As new SqlDataAdapter(command)
   Dim i as Integer
   For i=0 to parameters.Length-1
      command.Parameters.Add(parameters(i))
   Next
   adapter.Fill(tableToFill)
   adapter.Dispose()
Finally
   command.Dispose()
End Try

내 매개 변수 배열이 입력되었습니다 (이 SQL의 경우 단일 매개 변수 일뿐입니다)

parameters(0) = New SqlParameter("@UserID", SqlDbType.BigInt, 0, ParameterDirection.Input, True, 19, 0, "", DataRowVersion.Current, userID)

저장된 절차는 다음과 같은 선정 된 명령문 일뿐입니다.

ALTER PROC [dbo].[web_GetMyStuffFool]
   (@UserID BIGINT)
AS
SELECT Col1, Col2, Col3, Col3, Col3, Col3, Col3, Col3, Col3
FROM [Table]
도움이 되었습니까?

해결책

먼저 성능을 올바르게 프로파일 링하고 있는지 확인하십시오. 예를 들어, ado.net에서 쿼리를 두 번 실행하고 두 번째 시간이 처음보다 훨씬 빠릅니다. 이로 인해 앱이 컴파일 될 때까지 대기하고 디버깅 인프라가 증가하는 오버 헤드가 제거됩니다.

다음으로 Ado.net 및 SSMS에서 기본 설정을 확인하십시오. 예를 들어, SSMS에서 SET ARITHABORT를 실행하면 ADO.NET을 사용할 때만큼 느리게 실행될 수 있습니다.

내가 한 번 찾은 것은 SSMS에서 Arithabort를 설정하면 저장된 Proc가 재 컴파일 및/또는 다른 통계를 사용하게된다는 것입니다. 그리고 갑자기 SSM과 Ado.net은 거의 동일한 실행 시간을보고했습니다.

이를 확인하려면 각 실행의 실행 계획, 특히 SyscacheObjects 테이블을보십시오. 그들은 아마 다를 것입니다.

특정 저장된 프로 시저에서 'SP_RECOMPILE'을 실행하면 관련 실행 계획이 캐시에서 삭제 된 다음 SQL Server가 다음 프로 시저 실행에서보다 적절한 계획을 작성할 수있는 기회를 제공합니다.

마지막으로, 당신은 ""시도 할 수 있습니다.궤도에서 핵무기"SSMS를 사용하여 전체 프로 시저 캐시 및 메모리 버퍼를 청소하는 접근 방식 :

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

쿼리를 테스트하기 전에 그렇게하면 캐시 된 실행 계획 및 이전 결과 캐시의 사용을 방지합니다.

다른 팁

내가 한 일은 다음과 같습니다.

데이터베이스의 모든 테이블에서 인덱스를 재구성하기 위해 다음 SQL 문을 실행했습니다.

EXEC <databasename>..sp_MSforeachtable @command1='DBCC DBREINDEX (''*'')', @replacechar='*'
-- Replace <databasename> with the name of your database

SSMS에서 동일한 동작을보고 싶다면 다음과 같이 Proc를 실행했습니다.

SET ARITHABORT OFF
EXEC [dbo].[web_GetMyStuffFool] @UserID=1
SET ARITHABORT ON

이것을 우회하는 또 다른 방법은 이것을 코드에 추가하는 것입니다.

MyConnection.Execute "SET ARITHABORT ON"

동일한 문제에 부딪 쳤지 만 SQL 테이블에서 인덱스를 재건 할 때 제대로 작동 했으므로 SQL Server 측에서 인덱스 재 구축을 고려할 수 있습니다.

DataAdapter 대신 DataReader로 만들지 않겠습니까? 싱글 결과 세트가있는 것처럼 보이며 DB에서 변경 사항을 다시 푸시하지 않을 것이고 .NET 코드에 적용되는 제약 조건이 필요하지 않으면 사용하지 않아야합니다. 어댑터.

편집하다:

DataTable이 필요한 경우 DataReader를 통해 DB에서 데이터를 가져온 다음 .NET 코드에서 데이터 레이더를 사용하여 데이터 테이블을 채울 수 있습니다. 데이터 세트 및 데이터 아 다이프터에 의존하는 것보다 여전히 더 빠릅니다.

나는 "왜"가 너무 느립니다. 그러나 마커스가 지적하면서 MGMT 스튜디오를 데이터 세트를 채우는 것과 비교하는 것은 사과에 대한 사과입니다. 데이터 세트에는 많은 오버 헤드가 포함되어 있습니다. 나는 그들을 싫어하고 내가 도울 수 있다면 절대 사용하지 않는다.

기존 버전의 SQL 스택 또는 그와 같은 일부 버전의 불일치에 문제가있을 수 있습니다.

불행한 제약 조건으로 시도하는 한 가지는 DataReader를 사용하여 데이터베이스에 액세스하고 코드로 자신의 데이터 세트를 작성하는 것입니다. Google을 통해 쉽게 샘플을 찾을 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top