[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.값이 하드 코딩 할 때, 그것이이 테이블의 데이터 및 최적의 쿼리 실행에서 그림에있는 통계를 찾아 볼 수 있기 때문이다. 이러한 쿼리의 각 실행 계획에서보세요. 당신의 변수를 사용할 때 스캔해야합니다.
값이 하드 코딩 할 때, 그것이이 테이블의 데이터 및 최적의 쿼리 실행에서 그림에있는 통계를 찾아 볼 수 있기 때문이다. 이러한 쿼리의 각 실행 계획에서보세요. 당신의 변수를 사용할 때 스캔해야합니다.
범위는 항상 작은 경우이 도움 인덱스 힌트를 사용할 수 있습니다.
-
==============================
2.확인,
확인,
내 쿼리는 라이브러리로 이동을하고 3과 5 사이에 나에게 모든 책을 얻을
당신이 바로, 빠르고, 싸고, 효율적이고 충분히 큰 백 (3) 책을 수행하기 위해 자전거를 선택할 것입니다.
새로운 쿼리.
도서관에 가서 @x와 @y 사이의 모든 책을 얻을.
차량을 선택합니다.
어서.
그게 무슨입니다. 당신은 내가 1 MAXVALUE 사이에 책을 요청할 경우 덤프 트럭을 선택합니까? 즉, 과잉의 경우는 X = 3, Y = 5이다. SQL은 숫자를보기 전에 계획을 선택한다.
-
==============================
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.이 변수는 입력 변수가 저장된 프로 시저를 위해 인 경우에, 당신은 매개 변수 스니핑 문제로 실행 할 수있다. 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.이 쿼리가 저장 프로 시저에 관한처럼, 그 실행 계획은 시저가 실행 된 후 후속 실행을 위해 재사용 처음 컴파일 얻을 것이다 보인다.
이 쿼리가 저장 프로 시저에 관한처럼, 그 실행 계획은 시저가 실행 된 후 후속 실행을 위해 재사용 처음 컴파일 얻을 것이다 보인다.
값이 멀리 떨어져있을 때 컴파일 된 계획은, 그러나 그것 정말 좋은 firstid가 정말 가까이 lastid하는 상황에 정말 나쁜 것을 그것의 수.
당신의 저장된 프로 시저에 WITH RECOMPILE 옵션을 활성화하십시오. 이 문제를 해결하고 PROC의 존재에 만족하면 그것의 실행 (사용자가 성능 저하를 얻을 것이다)를이 떠날 때마다 다시 컴파일. 여전히 성능에 만족하는 경우는 재 컴파일이 필요하지 않습니다 있도록 시저를 다시의 아키텍처 고려하십시오.
-
==============================
6.ID는 지수 (예를 들어, 기본 키)에인가? 그렇지 않은 경우, 하나를 추가하려고합니다.
ID는 지수 (예를 들어, 기본 키)에인가? 그렇지 않은 경우, 하나를 추가하려고합니다.
또 다른 한가지는 첫 번째 (빠른) 인스턴스에서 쿼리가 약간 다르게 실행지고 있다고 할 수있다. 내가 본 가장 일반적인 일이 일어나는가 비효율적 위해 끝낼 조인 것입니다. 시도의 조인 재 주문, 또는 하위 쿼리 일부를 변환. 당신이 더 많은 쿼리의 게시 할 경우 우리는 추가로 지원할 수 있습니다.
-
==============================
7.사실, 그것은 나를 위해 일한 나는 그냥 여기에 해결 방법을 쓰기, 아주 잘 대답했다 :
사실, 그것은 나를 위해 일한 나는 그냥 여기에 해결 방법을 쓰기, 아주 잘 대답했다 :
는 SQL과 저장 프로 시저 만들기
WHERE id BETWEEN @firstId and @lastId
다음 후 매개 변수 @firstId와 @lastId로 저장된 프로 시저를 호출하고이 속도가 향상됩니다. 아직도 내가 그것을 작동하는 이유 100 %,하지만 작동합니다.
from https://stackoverflow.com/questions/313935/why-sql-server-go-slow-when-using-variables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 부동산의 열 이름은 최대 절전 모드로 매핑하기 (0) | 2020.07.03 |
---|---|
[SQL] 스크립트 SQL은 특정 테이블에 대한 외부 키를 찾는 방법은? (0) | 2020.07.03 |
[SQL] MySQL은 : 1 일 기준, 별개의 행을 카운트 (0) | 2020.07.03 |
[SQL] PostgreSQL의 테이블 변수 (0) | 2020.07.03 |
[SQL] 한 시스템에서 다른 시스템으로 SQL 서버 2008 R2 데이터베이스를 복사하는 방법 (0) | 2020.07.03 |