복붙노트

[SQL] SSMS에서 빠른 쿼리 매우 코드에서 느리지 만

SQL

SSMS에서 빠른 쿼리 매우 코드에서 느리지 만

내가 시간 제한을 받고 유지하는 것이 매우 간단한 쿼리를 가지고 내가 같은 컴퓨터에서 같은 쿼리를 실행할 때 그러나,이 코드에서 실행되는 경우에 (가 완료 될 때까지 삼분 인수, 나는이 질문을 게시 할 수 있도록 일찍 중단) SQL Server Management Studio의 쿼리 만 2532 MS 데이터가 서버와 반복 쿼리 (524) MS에 캐시되지 않은 첫 번째 쿼리를 취할 것입니다.

여기 내 C # 코드는

using (var conn = new SqlConnection("Data Source=backend.example.com;Connect Timeout=5;Initial Catalog=Logs;Persist Security Info=True;User ID=backendAPI;Password=Redacted"))
                using (var ada = new SqlDataAdapter(String.Format(@"
SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt 
FROM [ES_HISTORY] 
inner join [es_history_dt] on [PK_JOB] = [es_historyid] 
Where client_id = @clientID and dt > @dt and (job_type > 4 {0}) {1}
Order by dt desc"
     , where.ToString(), (cbShowOnlyFailed.Checked ? "and Status = 1" : "")), conn))
{
    ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
    ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value);
    //ada.SelectCommand.CommandTimeout = 60;
    conn.Open();
    Logs.Clear();
    ada.Fill(Logs); //Time out exception for 30 sec limit.
}

여기에 내가 SSMS에서 실행하고 내 코드가, 나는 ada.SelectCommand.CommandText에서 바로 뽑아

declare @clientID varchar(200)
set @clientID = '138'
declare @dt datetime
set @dt = '9/19/2011 12:00:00 AM'

SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt 
FROM [ES_HISTORY] 
inner join [es_history_dt] on [PK_JOB] = [es_historyid] 
Where client_id = @clientID and dt > @dt and (job_type > 4 or job_type = 0 or job_type = 1 or job_type = 4 ) 
Order by dt desc

어떤 시간의 차이에 대한 주요 불일치의 원인?

깨끗한 주석 섹션을 유지하기 위해, 나는 몇 가지 질문이 여기에 응답 할 것이다.

같은 컴퓨터 로그온은 응용 프로그램과 SSMS 모두에 사용됩니다.

만 15 행 내 예를 들어 쿼리에서 반환됩니다. 그러나 es_history는 11,351,699 행을 포함하고 es_history_dt은 8,588,493 행이 포함되어 있습니다. 두 테이블은 잘 색인과 SSMS에서 실행 계획은 그들이 빠른 조회가 그래서 인덱스가 조회를 위해 노력 사용하고 있다고 말했습니다된다. 이 쿼리의 C # 버전에 대한 인덱스를 사용하지 않는 것처럼이 프로그램은 행동한다.

해결법

  1. ==============================

    1.SSMS의 코드는 응용 프로그램에서 실행되는 동일한 코드가 아닙니다. 응용 프로그램에서이 라인은 NVARCHAR 매개 변수를 추가합니다 :

    SSMS의 코드는 응용 프로그램에서 실행되는 동일한 코드가 아닙니다. 응용 프로그램에서이 라인은 NVARCHAR 매개 변수를 추가합니다 :

     ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
    

    SSMS 스크립트에있는 동안 당신은 VARCHAR로 선언

    declare @clientID varchar(200)
    

    @clientID 유형 NVARCHAR (나는 믿음의 도약을하고 CLIENT_ID 열을 가정하고있어 유형 VARCHAR이다)의 어디 인해 데이터 형식 우선 순위의 규칙에 쿼리의 경우 CLIENT_ID = @clientID 표현은 SARG-수 없습니다. 응용 프로그램은 따라서 SSMS 쿼리가 빠르게 키를 추구 할 수있는 테이블 스캔을 강제로. 이것은 잘 알고 Parameters.AddWithValue을 사용하여 문제를 이해하고 예를 들어, 전에 많은 기사에서 논의 된 것입니다. 데이터 액세스 코드 데이터베이스 성능에 미치는 영향을 참조하십시오. 문제가 이해되면, 솔루션은 사소한 있습니다 :

    그것은 SARG-능력 문제 외에 캐시 오염 문제를 해결할 수 있기 때문에 제 용액 우수하다.

    나는 또한 당신이 빠른 SSMS에서, 응용 프로그램에서 천천히 읽어 것이 좋습니다? 이해 성능 신비

  2. ==============================

    2.당신의 C #을 연결에 프로파일 러를 실행 - 당신이 인식하지 못하는 것을가는 다른 활동이있을 수 있습니다.

    당신의 C #을 연결에 프로파일 러를 실행 - 당신이 인식하지 못하는 것을가는 다른 활동이있을 수 있습니다.

  3. ==============================

    3.응용 프로그램을 실행할 때 수동으로 프로파일 러에서 다음 쿼리를 실행할 때 두 SSMS에서 실행 계획을 캡처합니다. 비교와 대조.

    응용 프로그램을 실행할 때 수동으로 프로파일 러에서 다음 쿼리를 실행할 때 두 SSMS에서 실행 계획을 캡처합니다. 비교와 대조.

  4. ==============================

    4.실행 DBCC FREEPROCCACHE, 여기에 제안, 단지 확인 문제로 인해 오래된 쿼리 실행 계획에 있지 않은지 확인합니다.

    실행 DBCC FREEPROCCACHE, 여기에 제안, 단지 확인 문제로 인해 오래된 쿼리 실행 계획에 있지 않은지 확인합니다.

  5. from https://stackoverflow.com/questions/7637907/query-extremely-slow-in-code-but-fast-in-ssms by cc-by-sa and MIT license