SQL 문 처리

단일 SQL 문 처리는 SQL Server가 SQL 문을 실행하는 가장 기본적인 방법입니다. 이러한 기본 프로세스의 예로 뷰 또는 원격 테이블이 없는 로컬 기본 테이블만 참조하는 단일 SELECT 문을 처리하는 경우를 들 수 있습니다.

SELECT 문 최적화

SELECT 문은 프로시저를 통하지 않습니다. 즉, 데이터베이스 서버가 요청한 데이터를 검색하는 데 사용해야 하는 정확한 단계를 지정하고 있지 않습니다. 이는 데이터베이스 서버가 문을 분석하여 요청한 데이터를 추출하는 가장 효율적인 방법을 판단해야 함을 의미합니다. 이것을 SELECT 문 최적화라고 하며 이를 위한 구성 요소를 쿼리 최적화 프로그램이라고 합니다. 최적화 프로그램에 대한 입력은 쿼리, 데이터베이스 스키마(테이블 및 인덱스 정의) 및 데이터베이스 통계로 이루어집니다. 최적화 프로그램의 출력은 쿼리 실행 계획이며 경우에 따라 쿼리 계획이나 그냥 계획이라고도 합니다. 쿼리 계획의 내용은 이 항목의 뒷부분에서 보다 자세히 설명됩니다.

다음 도표는 단일 SELECT 문을 최적화하는 동안 쿼리 최적화 프로그램에 입력되는 내용과 출력 내용을 보여 줍니다.

SELECT 문의 쿼리 최적화

SELECT 문은 다음 사항만 정의합니다.

  • 결과 집합의 서식. 대부분 SELECT 목록에 지정됩니다. 하지만 ORDER BY 및 GROUP BY와 같은 다른 절도 결과 집합의 최종 서식에 영향을 줍니다.

  • 원본 데이터를 포함하는 테이블. FROM 절에 지정됩니다.

  • 테이블이 SELECT 문의 목적과 논리적으로 관련되는 방식. 조인 사양에 정의되며 FROM 뒤에 따라오는 WHERE 절이나 ON 절에 포함될 수 있습니다.

  • 원본 테이블의 행이 SELECT 문의 결과에 포함되기 위해 만족시켜야 할 조건. 이것은 WHERE 및 HAVING 절에 지정됩니다.

쿼리 실행 계획은 다음 사항을 정의합니다.

  • 원본 테이블이 액세스되는 순서

    일반적으로 데이터베이스 서버는 다양한 방법으로 기본 테이블을 액세스하여 결과 집합을 작성할 수 있습니다. 예를 들어 SELECT 문이 세 개의 테이블을 참조하는 경우 데이터베이스 서버는 먼저 TableA를 액세스하고, TableA의 데이터를 사용하여 TableB에서 일치하는 행을 추출한 후 TableB의 데이터를 사용하여 TableC에서 데이터를 추출합니다. 다음은 데이터베이스 서버가 테이블에 액세스할 수 있는 여러 순서입니다.

    TableC, TableB, TableA 또는

    TableB, TableA, TableC 또는

    TableB, TableC, TableA 또는

    TableC, TableA, TableB

  • 각 테이블에서 데이터를 추출하는 데 사용하는 방법

    일반적으로 각 테이블의 데이터에 액세스하는 방법에는 여러 가지가 있습니다. 특정 키 값을 가진 몇몇 행만 필요한 경우 데이터베이스 서버는 인덱스를 사용할 수 있습니다. 테이블의 모든 행이 필요한 경우 데이터베이스 서버는 인덱스를 무시하고 테이블을 검색할 수 있습니다. 테이블의 모든 행이 필요하지만 키 열이 ORDER BY에 있는 인덱스가 있으면 테이블 검색 대신 인덱스 검색을 수행하여 다른 종류의 결과 집합을 저장할 수 있습니다. 테이블이 매우 작은 경우 테이블 검색은 거의 모든 테이블 액세스를 위한 가장 효율적인 방법일 수 있습니다.

여러 가능한 실행 계획 중에서 하나의 실행 계획을 선택하는 프로세스를 최적화라고 합니다. 쿼리 최적화 프로그램은 SQL 데이터베이스 시스템의 가장 중요한 구성 요소 중 하나입니다. 쿼리 최적화 프로그램에서 쿼리를 분석하고 계획을 선택할 때 오버헤드가 발생하지만 효율적인 실행 계획을 선택하면 오버헤드가 상당히 절감됩니다. 예를 들어 두 개의 건설 회사에 하나의 집에 대한 동일한 청사진이 제공될 수 있습니다. 한 회사에서는 며칠 동안 그 집을 어떻게 지을지 계획을 하는 동안 다른 회사는 계획 없이 집을 짓기 시작할 경우 프로젝트를 계획하는 데 시간을 소요한 회사가 먼저 작업을 끝내는 것과 같습니다.

SQL Server 쿼리 최적화 프로그램은 비용을 기반으로 하는 최적화 프로그램입니다. 가능한 각 실행 계획은 사용되는 컴퓨팅 리소스의 양과 관련하여 비용을 추산합니다. 쿼리 최적화 프로그램은 가능한 실행 계획을 분석하고 예상 비용이 가장 낮은 계획을 선택해야 합니다. 일부 복잡한 SELECT 문은 가능한 수많은 실행 계획을 포함합니다. 이 경우에 쿼리 최적화 프로그램은 가능한 모든 조합을 분석하지는 않습니다. 대신 복잡한 알고리즘을 사용하여 가장 최소 비용에 근접하는 실행 계획을 찾습니다.

SQL Server 쿼리 최적화 프로그램이 리소스 비용이 가장 낮은 실행 계획만 선택하는 것은 아닙니다. 쿼리 최적화 프로그램은 타당한 리소스 비용을 사용하여 사용자에게 결과를 반환하고 가장 빠른 결과를 반환하는 계획을 선택합니다. 예를 들어 병렬로 쿼리를 처리하는 것은 대개 직렬로 처리하는 것보다 많은 리소스를 사용하지만 쿼리를 좀 더 빠르게 끝냅니다. SQL Server 최적화 프로그램은 서버 로드에 나쁜 영향을 미치지 않는 경우 병렬 실행 계획을 사용하여 결과를 반환합니다.

쿼리 최적화 프로그램은 테이블 또는 인덱스에서 정보를 추출하는 다른 방법의 리소스 비용을 예상할 때 배포 통계를 이용합니다. 열 및 인덱스에 대해 배포 통계가 보유됩니다. 배포 통계는 특정 인덱스 또는 열에서 값의 선택도를 표시합니다. 예를 들어 자동차를 나타내는 테이블에서 많은 차가 동일한 제조업체의 것이지만 각 차는 고유의 차량 등록 번호(VIN)를 갖습니다. VIN에 대한 인덱스는 제조업체에 대한 인덱스보다 좀 더 선택적입니다. 인덱스 통계가 현재의 데이터가 아니면 쿼리 최적화 프로그램은 테이블의 현재 상태에 대해 최상의 선택을 하지 못할 수 있습니다. 인덱스 통계를 최신 상태로 유지하는 것에 대한 자세한 내용은 통계를 사용하여 쿼리 성능 향상를 참조하십시오.

쿼리 최적화 프로그램은 프로그래머나 데이터베이스 관리자의 입력을 요청하지 않고 데이터베이스 서버가 데이터베이스의 조건 변화에 맞춰 동적으로 조정될 수 있게 하므로 중요합니다. 이를 통해 프로그래머는 쿼리의 최종 결과를 설명하는 데 주안점을 둘 수 있습니다. 프로그래머는 문이 실행될 때마다 쿼리 최적화 프로그램이 데이터베이스의 상태에 맞게 효율적인 실행 계획을 세운다는 것을 신뢰할 수 있습니다.

SELECT 문 처리

SQL Server가 단일 SELECT 문을 처리하는 데 사용하는 기본 단계는 다음과 같습니다.

  1. 파서는 SELECT 문을 검색하고 그 결과를 키워드, 식, 연산자 및 식별자와 같은 논리 단위로 분류합니다.

  2. 시퀀스 트리라고도 하는 쿼리 트리가 작성되어 결과 집합에서 필요로 하는 서식으로 원본 데이터를 변환하는 데 필요한 논리 단계를 정의합니다.

  3. 쿼리 최적화 프로그램은 소스 테이블에 액세스할 수 있는 여러 다른 방법을 분석합니다. 그런 후 리소스 사용을 줄이는 동시에 결과를 가장 빨리 반환하는 일련의 단계를 선택합니다. 쿼리 트리는 이러한 일련의 단계가 기록되도록 업데이트됩니다. 최적화된 최종 쿼리 트리 버전은 실행 계획이라고 합니다.

  4. 관계형 엔진이 실행 계획을 실행하기 시작합니다. 기본 테이블의 데이터를 필요로 하는 단계가 처리될 때 관계형 엔진은 저장소 엔진이 관계형 엔진에서 요청된 행 집합의 데이터를 무시하도록 요청합니다.

  5. 관계형 엔진은 저장소 엔진에서 반환된 데이터를 결과 집합에 대해 정의된 서식으로 처리하고 클라이언트에 결과 집합을 반환합니다.

다른 문 처리

SELECT 문 처리의 기본 단계는 INSERT, UPDATE 및 DELETE와 같은 다른 SQL 문에도 적용됩니다. UPDATE 문과 DELETE 문은 둘 다 수정되거나 삭제될 행 집합을 대상으로 해야 합니다. 이러한 행을 식별하는 프로세스는 SELECT 문의 결과 집합을 구하는 데 사용되는 원본 행을 식별하는 방식과 동일합니다. UPDATE 및 INSERT 문은 모두 업데이트되거나 삽입될 데이터 값을 제공하는 SELECT 문을 포함할 수 있습니다.

CREATE PROCEDURE 또는 ALTER TABLE과 같은 DDL(데이터 정의 언어) 문도 결과적으로 시스템 카탈로그 테이블에 대한 관계형 작업으로 해석되며 ALTER TABLE ADD COLUMN 문처럼 데이터 테이블에 대한 관계형 작업으로 해석되는 경우도 있습니다.