SQL Server 일괄 처리 또는 태스크 일정 예약

각 SQL Server 인스턴스는 별도의 운영 체제 프로세스입니다. 각 인스턴스는 잠재적으로 동시에 발생하는 사용자의 수많은 요청을 처리해야 합니다. SQL Server 인스턴스는 Microsoft Windows 스레드 또는 파이버(구성된 경우)를 사용하여 이러한 동시 태스크를 효율적으로 관리합니다. 각 SQL Server 인스턴스는 항상 시스템 프로세스에 대해 몇 개의 스레드를 실행합니다. 각 서버 Net-Library에 대한 하나 이상의 스레드, 네트워크 I/O를 처리하기 위한 네트워크 스레드 및 서비스 제어 관리자와 통신하기 위한 신호 스레드 등 여러 스레드를 실행합니다.

일정 예약 이해

각 SQL Server 인스턴스에는 운영 체제와 비슷한 환경을 구현하는 내부 계층이 있습니다. Windows 커널을 호출하지 않고도 동시 태스크의 일정을 예약하고 동기화하는 데 이 내부 계층이 사용됩니다. 또한 파이버나 Windows 스레드의 일정을 예약하는 데도 이 내부 계층을 효과적으로 사용할 수 있습니다. 각 SQL Server 인스턴스는 사용자 쿼리를 처리하기 위한 Windows 스레드 또는 파이버 풀을 유지 관리합니다. 이러한 풀의 최대 크기는 max worker threads 서버 구성 옵션으로 제어합니다.

다음의 기본 용어를 숙지하면 요청 또는 태스크의 처리 방법을 이해하는 데 도움이 됩니다.

  • 연결(connection)
    사용자가 로그인에 성공하면 연결이 설정됩니다. 그런 다음 실행을 위해 하나 이상의 Transact-SQL 문을 전송할 수 있습니다. 사용자가 명시적으로 로그아웃하거나 연결이 종료되면 연결이 닫힙니다.

  • 일괄 처리(batch)
    SQL 일괄 처리는 클라이언트가 실행을 위해 SQL Server 인스턴스로 보낸 하나 이상의 Transact-SQL 문 집합입니다. 일괄 처리는 사용자에 의해 데이터베이스 엔진으로 전송된 작업 단위를 나타냅니다.

  • 태스크(task)
    태스크는 SQL Server에서 일정을 예약한 작업 단위를 나타냅니다. 일괄 처리 한 개를 하나 이상의 태스크에 매핑할 수 있습니다. 예를 들어 하나의 병렬 쿼리가 여러 태스크에 의해 실행될 수 있습니다.

  • Windows 스레드
    각 Windows 스레드는 독립 실행 메커니즘을 나타냅니다.

  • 파이버(fiber)
    파이버는 Windows 스레드보다 리소스 사용량이 적고 사용자 모드에서 컨텍스트를 전환할 수 있는 경량 스레드입니다. Windows 스레드 한 개를 여러 개의 파이버에 매핑할 수 있습니다.

  • 작업자 스레드
    작업자 스레드는 Windows 스레드 또는 파이버(lightweight pooling 옵션이 ON인 경우)에 내부적으로 일 대 일 매핑되는 SQL Server의 논리적 스레드를 나타냅니다. 메모리 부족 또는 오랜 기간 동안 유휴 상태여서 작업자 스레드의 할당이 취소될 때까지는 매핑이 유지됩니다. 태스크와 작업자 스레드 간 연결은 해당 작업의 유효 기간 동안 유지됩니다.

사용자 연결 및 작업자 스레드 리소스 관리

스레드 및 파이버는 리소스를 많이 사용하지는 않지만 계속해서 소비합니다. 수많은 사용자가 연결된 시스템에서 연결당 하나의 작업자 스레드가 있으면 리소스 사용량이 많아 SQL Server의 효율성이 감소할 수 있습니다. 또한 대부분의 연결이 실제로 클라이언트로부터 일괄 처리를 받는 데 많은 시간을 소비하므로 각 사용자 연결에 전용 작업자 스레드를 할당할 필요가 없습니다. 대신 SQL Server 인스턴스는 작업자 스레드 풀을 사용합니다. 작업자 스레드 풀은 해당 인스턴스에서 동시에 일괄 처리를 실행하는 사용자 연결 수를 처리하기에 충분할 만큼만 필요합니다. max worker threads 옵션을 기본값 0으로 유지하면 SQL Server 인스턴스가 여러 작업자 스레드 간에 사용자 연결을 적절히 매핑하여 리소스를 너무 많이 사용하지 않도록 합니다.

파이버에 대해 SQL Server 구성

lightweight pooling 서버 구성 옵션은 SQL Server 인스턴스가 스레드 또는 파이버를 사용할지 여부를 제어합니다. 이 옵션의 기본값은 0입니다. 이 값은 SQL Server 인스턴스가 max worker threads 옵션에 설정된 값만큼 작업 스레드당 하나씩 Windows 스레드를 예약함을 나타냅니다. lightweight pooling을 1로 설정하면 SQL Server에서 Windows 스레드 대신 파이버를 사용합니다. 이를 파이버 모드로 실행이라고 합니다. 파이버 모드에서는 SQL Server 인스턴스가 SQL 스케줄러당 Windows 스레드를 하나씩 할당한 다음 max worker threads 설정된 값만큼 작업 스레드당 하나씩 파이버를 할당합니다. SQL Server 인스턴스는 Windows 스레드 또는 파이버를 사용할 때 동일한 알고리즘을 통해 태스크를 예약하고 동기화합니다. SQL Server Express에서는 파이버를 지원하지 않습니다. 자세한 내용은 lightweight pooling 옵션 사용을 참조하십시오. 일상 작업을 예약하는 데 파이버 모드를 사용하지 않는 것이 좋습니다. 파이버 모드를 사용하면 컨텍스트 전환을 활용하지 못해 성능이 저하될 수 있으며 SQL Server의 일부 구성 요소가 파이버 모드에서 제대로 작동하지 않을 수 있습니다. 자세한 내용은 lightweight pooling을 참조하십시오.

일괄 처리 또는 태스크 일정 예약 방법

응용 프로그램에서 데이터베이스 엔진에 연결하면 응용 프로그램에 세션 ID(SPID)가 할당됩니다. 연결 유효 기간 동안 유지 관리되어야 하는 모든 정보는 이 SPID와 연결된 내부 데이터 구조를 통해 관리됩니다. SQL Server 인스턴스가 클라이언트로부터 일괄 처리를 받으면 일괄 처리를 하나 이상의 태스크로 나눈 다음 작업자 스레드 풀의 사용 가능한 작업자 스레드를 각 작업에 연결합니다. 작업자 스레드는 작업 유효 기간 동안 태스크에 바인딩됩니다. 작업자 스레드는 스레드와 연결된 SQL 스케줄러에서 요청을 실행합니다. 사용할 수 있는 빈 작업자 스레드가 없고 max worker threads 값에 아직 도달하지 않은 경우에는 SQL Server 인스턴스가 새 일괄 처리에 새 작업자 스레드를 할당합니다. 사용할 수 있는 빈 스레드 또는 파이버가 없고 max worker threads 값에 이미 도달한 경우에는 SQL Server 인스턴스가 작업자 스레드가 해제될 때까지 새 태스크를 차단합니다.

작업자 스레드를 태스크에 연결하면 일괄 처리에서 생성한 마지막 결과 집합이 클라이언트에 반환되는 경우와 같이 작업이 완료될 때까지 이 연결 상태가 유지됩니다. 작업이 완료되면 작업자 스레드가 해제되어 다음 일괄 처리에 있는 태스크와 연결할 수 있습니다.

데이터베이스 엔진은 일괄 처리를 받은 시점부터 결과가 클라이언트에 반환될 때까지 연결에 대해 작업을 수행해야 합니다. 이 기간 동안 일괄 처리에 대해 처리 작업이 필요하지 않을 때도 있습니다. 예를 들어 읽기 작업이 현재 쿼리에 필요한 데이터를 읽어들이는 동안 또는 다른 일괄 처리에서 잠금을 해제할 때까지 데이터베이스 엔진에서 대기해야 할 때가 있습니다. 태스크와 작업자 스레드 간 연결은 일부 리소스에 대해 작업이 차단된 경우에도 유지됩니다.

데이터베이스 엔진에서는 일괄 처리와 연결된 태스크 처리를 시작할 때마다 작업과 연결된 작업자 스레드가 작업을 수행하도록 일정을 예약합니다. 작업자 스레드가 해당 태스크에 대해 작업을 완료하면 SQL Server 인스턴스가 준비된 다음 작업으로 작업자 스레드를 디스패치합니다. SPID는 해당 연결의 유효 기간 동안 일정하게 유지됩니다. 오래 실행되는 연결에는 다수의 작업자 스레드에 의해 실행되는 개별 일괄 처리 태스크가 여러 개 있을 수 있습니다. 예를 들어 첫 번째 일괄 처리의 태스크는 작업자 1에 의해 실행되고 두 번째 일괄 처리의 작업은 작업자 2에 의해 실행될 수 있습니다. 일부 문은 병렬로 처리할 수 있습니다. 이 경우 동시에 다수의 작업자 스레드에 의해 실행되는 여러 개의 태스크가 일괄 처리에 포함될 수 있습니다.