쿼리 플랜

쿼리 플랜(query plan) 또는 쿼리 실행 계획(query execution plan)은 SQL 관계형 데이터베이스 관리 시스템의 데이터 접근에 사용되는 순서가 있는 단계별 집합이다. 이는 액세스 플랜의 관계형 모델 개념의 특화된 경우이다.

SQL이 선언형이기 때문에 주어진 쿼리를 실행하기 위해 수많은 방법이 존재하는 것이 일반적이며 이에 따라 다양한 성능 차이를 보인다. 쿼리가 데이터베이스에 제출되면 쿼리 옵티마이저는 쿼리 실행을 위한 각기 다른 가능성 있는 올바른 플랜 중 일부를 평가한 다음 최적의 옵션을 고려할 때 반환한다. 쿼리 옵티마이저가 불완전하기 때문에 데이터베이스 사용자와 관리자들은 더 나은 성능을 얻기 위해 옵티마이저가 만들어내는 플랜을 수동으로 검사하고 튜닝해야 하는 경우가 있다.

쿼리 플랜 생성 
제공된 데이터베이스 관리 시스템은 주어진 쿼리의 플랜을 반환하기 위한 하나 이상의 매커니즘을 제공할 수 있다. 일부 패키지에는 그래픽으로 표현되는 쿼리 플랜을 생성하는 도구가 포함된다. 기타 도구들은 특수한 모드를 통해 DBMS가 텍스트 방식으로 쿼리 플랜을 기술할 수 있도록 설정한다. 쿼리 플랜을 조회하는 다른 매커니즘에는 검사할 쿼리를 실행한 이후 가상 데이터베이스 테이블을 조회하는 것이 수반된다. 이를테면 오라클에서는 EXPLAIN PLAN 문을 사용하여 이를 수행할 수 있다.

그래픽 플랜 

이를테면 마이크로소프트 SQL 서버에 포함되어 있는 SQL 서버 매니지먼트 스튜디오 도구는 샘플 데이터베이스에 대해 이 2개의 테이블 조인(join)을 실행할 때 그래픽 플랜을 표시한다.

SELECT *
FROM HumanResources.Employee AS e
    INNER JOIN Person.Contact AS c
    ON e.ContactID = c.ContactID
ORDER BY c.LastName

UI는 쿼리 플랜에 수반되는 다양한 연산자 속성의 탐색을 허용하는데, 여기에는 연산자 타입, 각 연산자가 소비하거나 만들어내는 로우(row)의 수, 각 연산자의 작업의 예측되는 비용이 포함된다.

텍스트 플랜 
위와 동일한 쿼리의 텍스트 플랜은 여기에 표시된다:

StmtText
----
  |--Sort(ORDER BY:([c].[LastName] ASC))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([e].[ContactID], [Expr1004]) WITH UNORDERED PREFETCH)
            |--Clustered Index Scan(OBJECT:([AdventureWorks].[HumanResources].[Employee].[PK_Employee_EmployeeID] AS [e]))
            |--Clustered Index Seek(OBJECT:([AdventureWorks].[Person].[Contact].[PK_Contact_ContactID] AS [c]),
               SEEK:([c].[ContactID]=[AdventureWorks].[HumanResources].[Employee].[ContactID] as [e].[ContactID]) ORDERED FORWARD)

데이터베이스 튜닝

쿼리 튜닝

외부 링크 
 Video tutorial on how to perform SQL performance tuning with reference to Oracle

데이터베이스 관리 시스템
SQL