복붙노트

[SQL] 변수를 사용하는 경우 SQL Server는 천천히가는 이유는 무엇입니까?

SQL

변수를 사용하는 경우 SQL Server는 천천히가는 이유는 무엇입니까?

나는 SQL 쿼리가 그 실행 슈퍼 빠른, 약 1 초와 같은 변수를 사용하지 않을 경우 :

WHERE id BETWEEN 5461094 and 5461097

하지만이있을 때 :

declare @firstId int
declare @lastId int

set @firstId = 5461094
set @lastId = 5461097

...
    WHERE id BETWEEN @firstId and @lastId

... 쿼리는 일부 분 마무리, 정말 느리게 실행됩니다. 왜 발생합니까? 나는 변수를 사용해야합니다. 나는이 성능 문제를 피하기 위해 어떤 개선 할 수 있습니까?

해결법

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

    1.값이 하드 코딩 할 때, 그것이이 테이블의 데이터 및 최적의 쿼리 실행에서 그림에있는 통계를 찾아 볼 수 있기 때문이다. 이러한 쿼리의 각 실행 계획에서보세요. 당신의 변수를 사용할 때 스캔해야합니다.

    값이 하드 코딩 할 때, 그것이이 테이블의 데이터 및 최적의 쿼리 실행에서 그림에있는 통계를 찾아 볼 수 있기 때문이다. 이러한 쿼리의 각 실행 계획에서보세요. 당신의 변수를 사용할 때 스캔해야합니다.

    범위는 항상 작은 경우이 도움 인덱스 힌트를 사용할 수 있습니다.

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

    2.확인,

    확인,

    내 쿼리는 라이브러리로 이동을하고 3과 5 사이에 나에게 모든 책을 얻을

    당신이 바로, 빠르고, 싸고, 효율적이고 충분히 큰 백 (3) 책을 수행하기 위해 자전거를 선택할 것입니다.

    새로운 쿼리.

    도서관에 가서 @x와 @y 사이의 모든 책을 얻을.

    차량을 선택합니다.

    어서.

    그게 무슨입니다. 당신은 내가 1 MAXVALUE 사이에 책을 요청할 경우 덤프 트럭을 선택합니까? 즉, 과잉의 경우는 X = 3, Y = 5이다. SQL은 숫자를보기 전에 계획을 선택한다.

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

    3.재미는이 코드는 빠른 너무 될 것입니다 :

    재미는이 코드는 빠른 너무 될 것입니다 :

    DECLARE @sql VARCHAR(8000)
    
    SET @sql = 'SELECT * FROM table_x WHERE id BETWEEN ' + CAST(@firstId AS VARCHAR) + ' AND ' + CAST(@lastId AS VARCHAR)
    
    EXEC (@sql)
    

    (MSSQL 2000)

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

    4.이 변수는 입력 변수가 저장된 프로 시저를 위해 인 경우에, 당신은 매개 변수 스니핑 문제로 실행 할 수있다. http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

    이 변수는 입력 변수가 저장된 프로 시저를 위해 인 경우에, 당신은 매개 변수 스니핑 문제로 실행 할 수있다. http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

  5. ==============================

    5.이 쿼리가 저장 프로 시저에 관한처럼, 그 실행 계획은 시저가 실행 된 후 후속 실행을 위해 재사용 처음 컴파일 얻을 것이다 보인다.

    이 쿼리가 저장 프로 시저에 관한처럼, 그 실행 계획은 시저가 실행 된 후 후속 실행을 위해 재사용 처음 컴파일 얻을 것이다 보인다.

    값이 멀리 떨어져있을 때 컴파일 된 계획은, 그러나 그것 정말 좋은 firstid가 정말 가까이 lastid하는 상황에 정말 나쁜 것을 그것의 수.

    당신의 저장된 프로 시저에 WITH RECOMPILE 옵션을 활성화하십시오. 이 문제를 해결하고 PROC의 존재에 만족하면 그것의 실행 (사용자가 성능 저하를 얻을 것이다)를이 떠날 때마다 다시 컴파일. 여전히 성능에 만족하는 경우는 재 컴파일이 필요하지 않습니다 있도록 시저를 다시의 아키텍처 고려하십시오.

  6. ==============================

    6.ID는 지수 (예를 들어, 기본 키)에인가? 그렇지 않은 경우, 하나를 추가하려고합니다.

    ID는 지수 (예를 들어, 기본 키)에인가? 그렇지 않은 경우, 하나를 추가하려고합니다.

    또 다른 한가지는 첫 번째 (빠른) 인스턴스에서 쿼리가 약간 다르게 실행지고 있다고 할 수있다. 내가 본 가장 일반적인 일이 일어나는가 비효율적 위해 끝낼 조인 것입니다. 시도의 조인 재 주문, 또는 하위 쿼리 일부를 변환. 당신이 더 많은 쿼리의 게시 할 경우 우리는 추가로 지원할 수 있습니다.

  7. ==============================

    7.사실, 그것은 나를 위해 일한 나는 그냥 여기에 해결 방법을 쓰기, 아주 잘 대답했다 :

    사실, 그것은 나를 위해 일한 나는 그냥 여기에 해결 방법을 쓰기, 아주 잘 대답했다 :

    는 SQL과 저장 프로 시저 만들기

    WHERE id BETWEEN @firstId and @lastId
    

    다음 후 매개 변수 @firstId와 @lastId로 저장된 프로 시저를 호출하고이 속도가 향상됩니다. 아직도 내가 그것을 작동하는 이유 100 %,하지만 작동합니다.

  8. from https://stackoverflow.com/questions/313935/why-sql-server-go-slow-when-using-variables by cc-by-sa and MIT license