커서 성능 최적화

최적의 성능을 향상시킬 기술 커서 : 피할 수 커서를 사용하는 경우.

 

- 켄 헨더슨 "거래-SQL 권위있는 가이드"에서 발췌 [과]

    최적의 성능을 향상시킬 기술 커서 : 피할 수 커서를 사용하는 경우. SQL Server는 데이터 세트를 처리하는 관계형 데이터베이스가 단일 액세스 라인은 관계 DBMS에 맞지 않는 하나의 라인을 다루는 것보다 훨씬 더 나은 경우도 있습니다. 커서를 사용할 때 피할 수없는 경우, 다음과 같은 팁 커서의 성능을 최적화 할 수 있습니다.
(1) 그렇지 않는 정적 / 문자를 구분 커서를 사용할 필요가 없습니다. 정적 커서를 열고 모든 행이 임시 테이블에 복사됩니다 원인이됩니다. 이것은 변화에 민감하지 왜 이유이다 - 실제로 데이터베이스 테이블의 임시 백업 가리키고 있습니다. 물론, 결과 집합 큰 정적 커서에 문 이상의 자원 경합 임시 데이터베이스 문제로 이어질 것입니다.
(2) 그렇지 않은 경우를 제외하고는 키 집합 커서를 사용할 필요가 없습니다. 그리고 정적 커서는 같은 오픈 키 집합 커서는 임시 테이블을 생성합니다. (거기에는 고유 키하지 않는 한), 그러나 큰 결과를 처리 할 때하는 것은 여전히 매우 큰 설정이 목록은 기본 테이블의 하나의 키 열이 포함되어 있지만.
(3) 대신 FAST_FORWARD FORWARD_ONLY 사용하는 읽기 전용 단방향 결과 세트를 처리 할 때. FORWARD_ONLY를 정의 FAST_FORWARD 사용하여, 커서는 특정 내부 READ_ONLY 성능 최적화가 있습니다.
(4) READ_ONLY 키워드를 사용하여 읽기 전용 커서를 정의합니다. 이것은 우발적 인 변경을 방지하고, 서버가 커서가 이동 될 때 알고 줄을 수정하지 않습니다 수 있습니다.
(5) 커서가 변경 한 거래를 통해 많은 수의 행. 트랜잭션 격리 수준 전에 잠겨 따르면,이 행 또는 롤백 트랜잭션 서버에서 리소스 경합이 발생할 수있는 완료됩니다.
같은 행 또는 라인 변화의 실수를 반복 -. 그들은 "할로윈"문제가 발생할 수 있기 때문에 (6),주의 동적 커서 변화, 특히 커서의 고유하지 않은 클러스터 된 인덱스 키 테이블을 기반으로합니다. SQL 서버 나중에 이미 키워드 것이다 내부 행에 존재하는 값으로 수정 및 추가 인덱스 서버를 강제 때문에 다음 결과 세트를 이동할 수 있습니다. 결과 집합 내의 나머지 아이템의 액세스 라인을 발생하는 것이며, 그 과정이 반복 될 때, 무한 루프 발생.
(7) 큰 결과를 호출자에게 제어 최대한 비동기 커서를 사용하는 것이 설정한다. 가동 테이블 큰 결과 집합을 반환 할 때 그들은 애플리케이션이 즉시 선을 표시 할 수 있기 때문에, 비동기 커서는 특히 유용하다.

할로윈:

CREATE   (#T를
    K1의 INT, 그  탑의 정체성 (1,1) ,,
    C1 INT  널 (null)
);
 
CREATE  CLUSTERED  INDEX의 C1을 ON #T (C1);
 
INSERT INTO #T (C1) VALUES (8)
INSERT INTO #T (C1) VALUES (6)
INSERT INTO #T (C1) VALUES (7)
INSERT INTO #T (C1) VALUES (5)
INSERT INTO #T (C1) VALUES (3)
INSERT INTO #T (C1) VALUES (0)
INSERT INTO #T (C1) VALUES (9)
 
 
DECLARE C 커서  DYNAMIC을
    FOR  SELECT K1, C1 FROM #T;
 
OPEN C
FETCH C를
WHILE (@@ FETCH_STATUS = 0)
BEGIN
    UPDATE #T SET C1 = C1 + 1
        WHERE  CURRENT  OF C;
    FETCH C 단계;
종료
 
CLOSE C;
DEALLOCATE C;
 
DROP   #T;
가기

HTTPS : //www.cnblogs.com/happyhippy/archive/2009/03/29/1424441.html 재현

추천

출처blog.csdn.net/weixin_34402408/article/details/94676460