커서(SQL Server)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

관계형 데이터베이스의 작업은 전체 행 집합에서 작동합니다. 예를 들어 문에서 반환되는 SELECT 행 집합은 문 절의 조건을 충족하는 모든 행으로 WHERE 구성됩니다. 문에서 반환된 이 전체 행 집합을 결과 집합이라고 합니다. 애플리케이션, 특히 대화형 온라인 애플리케이션은 전체 결과 집합을 단위로 사용하여 항상 효과적으로 작동할 수 없습니다. 이러한 애플리케이션에는 한 번에 하나의 행 또는 작은 행 블록으로 작업하는 메커니즘이 필요합니다. 커서는 해당 메커니즘을 제공하는 결과 집합의 확장입니다.

커서는 다음과 같이 결과 처리를 확장합니다.

  • 결과 집합의 특정 행에서 위치 지정을 허용합니다.

  • 결과 집합의 현재 위치에서 한 행 또는 행 블록을 검색합니다.

  • 결과 집합의 현재 위치에 있는 행에 대한 데이터 수정 지원

  • 결과 집합에 표시되는 데이터베이스 데이터에 대한 다른 사용자의 변경 내용에 대한 다양한 수준의 가시성을 지원합니다.

  • 스크립트, 저장 프로시저 및 트리거에 Transact-SQL 문을 제공하면 결과 집합의 데이터에 대한 액세스가 트리거됩니다.

설명

일부 시나리오에서는 테이블에 WHILE 기본 키가 있는 경우 커서 오버헤드가 발생하지 않고 커서 대신 루프를 사용할 수 있습니다.

그러나 커서가 피할 수 없을 뿐만 아니라 실제로 필요한 시나리오도 있습니다. 이 경우 커서를 기반으로 테이블을 업데이트할 필요가 없는 경우 빠른 전달 및 읽기 전용 커서를 의미하는 파이어호스 커서를 사용합니다.

커서 구현

SQL Server는 세 가지 커서 구현을 지원합니다.

커서 구현 설명
Transact-SQL 커서 Transact-SQL 커서는 구문을 기반으로 DECLARE CURSOR 하며 Transact-SQL 스크립트, 저장 프로시저 및 트리거에서 기본 사용하여 사용됩니다. Transact-SQL 커서는 서버에서 구현되며 클라이언트에서 서버로 전송된 Transact-SQL 문으로 관리됩니다. 일괄 처리, 저장 프로시저 또는 트리거에도 포함될 수 있습니다.
API(애플리케이션 프로그래밍 인터페이스) 서버 커서 API 커서는 OLE DB 및 ODBC에서 API 커서 함수를 지원합니다. API 서버 커서는 서버에서 구현됩니다. 클라이언트 애플리케이션이 API 커서 함수를 호출할 때마다 SQL Server Native Client OLE DB 공급자 또는 ODBC 드라이버는 API 서버 커서에 대한 작업을 위해 서버에 요청을 전송합니다.
클라이언트 커서 클라이언트 커서는 SQL Server Native Client ODBC 드라이버 및 ADO API를 구현하는 DLL에 의해 내부적으로 구현됩니다. 클라이언트 커서는 클라이언트의 모든 결과 집합 행을 캐싱하여 구현됩니다. 클라이언트 애플리케이션이 API 커서 함수를 호출할 때마다 SQL Server Native Client ODBC 드라이버 또는 ADO DLL은 클라이언트에 캐시된 결과 집합 행에 대해 커서 작업을 수행합니다.

커서 유형

SQL Server는 4개의 커서 형식을 지원합니다.

커서는 worktable을 사용할 tempdb 수 있습니다. 유출되는 집계 또는 정렬 작업과 마찬가지로 I/O 비용이 발생하며 잠재적인 성능 병목 현상이 발생합니다. STATIC 커서는 처음부터 worktable을 사용합니다. 자세한 내용은 쿼리 처리 아키텍처 가이드의 worktables 섹션을 참조하세요.

전달 전용

정방향 전용 커서는 스크롤로 FORWARD_ONLY 지정되며 READ_ONLY 스크롤을 지원하지 않습니다. 이를 파이어호스 커서라고도 하며 커서의 시작부터 끝까지 행을 직렬로 가져오는 것만 지원합니다. 행은 가져올 때까지 데이터베이스에서 검색되지 않습니다. 현재 사용자가 만들거나 다른 사용자가 커밋하여 결과 세트의 행에 영향을 주는 모든 INSERT, UPDATEDELETE 문의 결과는 행이 커서에서 인출될 때 표시됩니다.

커서를 뒤로 스크롤할 수 없으므로 행을 가져온 후 데이터베이스의 행에 대한 대부분의 변경 내용은 커서를 통해 표시되지 않습니다. 클러스터형 인덱스가 적용되는 열을 업데이트하는 등 결과 집합 내의 행 위치를 결정하는 데 사용되는 값이 수정되는 경우 수정된 값은 커서를 통해 표시됩니다.

데이터베이스 API 커서 모델은 전달 전용 커서를 고유한 유형의 커서로 간주하지만 SQL Server는 그렇지 않습니다. SQL Server는 정적, 키 집합 기반 및 동적 커서에 적용할 수 있는 옵션으로 정방향 전용 및 스크롤을 모두 고려합니다. Transact-SQL 커서는 정방향 전용 정적, 키 집합 기반 및 동적 커서를 지원합니다. 데이터베이스 API 커서 모델은 정적, 키 집합 기반 및 동적 커서를 항상 스크롤할 수 있다고 가정합니다. 데이터베이스 API 커서 특성 또는 속성이 정방향 전용으로 설정된 경우 SQL Server는 이를 정방향 전용 동적 커서로 구현합니다.

정적

정적 커서의 전체 결과 집합은 커서가 열릴 때 빌드 tempdb 됩니다. 정적 커서는 커서가 열렸을 때와 마찬가지로 항상 결과 집합을 표시합니다. 정적 커서는 변경 내용을 거의 검색하지 못하는 반면 스크롤 시 리소스를 거의 소비하지 않습니다.

커서는 결과 집합의 멤버 자격 또는 결과 집합을 구성하는 행 열의 값 변경에 영향을 주는 데이터베이스의 변경 내용을 반영하지 않습니다. 커서 문의 검색 조건과 일치하더라도 정적 커서는 커서를 연 후 데이터베이스에 삽입된 새 행을 SELECT 표시하지 않습니다. 결과 집합을 구성하는 행이 다른 사용자가 업데이트하는 경우 새 데이터 값은 정적 커서에 표시되지 않습니다. 정적 커서는 커서를 연 후 데이터베이스에서 삭제된 행을 표시합니다. INSERTDELETE 커서UPDATE를 닫고 다시 열지 않는 한 정적 커서에 작업이 반영되지 않으며 커서를 연 것과 동일한 연결을 사용하여 수정한 내용도 없습니다.

참고 항목

SQL Server 정적 커서는 항상 읽기 전용입니다.

정적 커서의 결과 집합은 작업 테이블에 tempdb저장되므로 결과 집합의 행 크기는 SQL Server 테이블의 최대 행 크기를 초과할 수 없습니다.

자세한 내용은 쿼리 처리 아키텍처 가이드의 worktables 섹션을 참조하세요. 최대 행 크기에 대한 자세한 내용은 SQL Server의 최대 용량 사양을 참조하세요.

Transact-SQL은 정적 커서에 대해 구분되지 않는 용어를 사용합니다. 일부 데이터베이스 API는 이를 스냅샷 커서로 식별합니다.

키 집합 커서의 멤버 자격과 행 순서는 커서가 열릴 때 고정됩니다. 키 집합 기반 커서는 키 집합이라고 하는 고유 식별자 또는 키 집합에 의해 제어됩니다. 키는 결과 집합에서 행을 고유하게 식별하는 열 집합으로 작성됩니다. 키 집합은 커서가 열릴 때 문에 한 SELECT 정된 모든 행의 키 값 집합입니다. 키 집합 기반 커서의 키 집합은 커서를 열 때 기본으로 빌드 tempdb 됩니다.

동적

동적 커서는 정적 커서와 반대입니다. 동적 커서는 커서를 스크롤할 때 결과 집합의 행에 대한 모든 변경 내용을 반영합니다. 결과 집합에 있는 행의 데이터 값, 순서 및 멤버 자격은 각 인출에서 변경될 수 있습니다. 모든 사용자가 만든 모든 UPDATE, INSERTDELETE 문이 커서를 통해 표시됩니다. 업데이트 API 함수 SQLSetPos 또는 Transact-SQL WHERE CURRENT OF 절을 사용하여 커서를 통해 만들어진 경우 즉시 표시됩니다. 커서 트랜잭션 격리 수준이 커밋되지 않은 읽기로 설정되지 않는 한 커서 외부에서 만들어진 업데이트 커밋될 때까지 표시되지 않습니다. 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.

참고 항목

동적 커서 계획은 공간 인덱스를 사용하지 않습니다.

커서 요청

SQL Server는 커서를 요청하는 두 가지 메서드를 지원합니다.

  • Transact-SQL

    Transact-SQL 언어는 ISO 커서 구문을 모델로 한 커서를 사용하기 위한 구문을 지원합니다.

  • API(데이터베이스 애플리케이션 프로그래밍 인터페이스) 커서 함수

    SQL Server는 다음 데이터베이스 API의 커서 기능을 지원합니다.

    • ADO(Microsoft ActiveX Data Object)

    • OLE DB

    • ODBC(Open Database Connectivity)

애플리케이션은 커서를 요청하는 두 가지 방법을 혼합해서는 안 됩니다. API를 사용하여 커서 동작을 지정하는 애플리케이션은 Transact-SQL 문을 실행하여 Transact-SQL DECLARE CURSOR 커서도 요청하면 안 됩니다. 애플리케이션은 모든 API 커서 특성을 기본값으로 다시 설정하는 경우에만 실행 DECLARE CURSOR 해야 합니다.

Transact-SQL 및 API 커서가 요청되지 않은 경우 SQL Server는 기본 결과 집합이라고 하는 전체 결과 집합을 애플리케이션에 반환하도록 기본값으로 지정합니다.

커서 프로세스

Transact-SQL 커서와 API 커서는 구문이 다르지만 다음 일반 프로세스는 모든 SQL Server 커서와 함께 사용됩니다.

  1. Transact-SQL 문의 결과 집합과 커서를 연결하고 커서의 행을 업데이트할 수 있는지 여부와 같은 커서의 특성을 정의합니다.

  2. Transact-SQL 문을 실행하여 커서를 채웁니다.

  3. 보려는 커서의 행을 검색합니다. 커서에서 한 행이나 한 행 블록을 검색하는 작업을 인출이라고 합니다. 일련의 페치를 수행하여 앞으로 또는 뒤로 방향으로 행을 검색하는 것을 스크롤이라고 합니다.

  4. 필요에 따라 커서의 현재 위치에 있는 행에서 수정 작업(업데이트 또는 삭제)을 수행합니다.

  5. 커서를 닫습니다.