[DB] 데이터베이스 실행 계획

Posted by 김성철

DB - 데이터베이스 실행계획

데이터베이스 실행 계획은 쿼리 실행 시 데이터베이스 시스템이 쿼리를 처리하는 방법을 설명하는 계획입니다.  
데이터베이스 시스템은 쿼리를 실행하기 전에 실행 계획을 생성하고, 이를 기반으로 쿼리를 처리합니다.  
실행 계획은 쿼리 처리에 사용되는 인덱스, 테이블 조인 방법, 필터링 조건, 정렬 순서 등의 정보를 포함합니다.  
  
데이터베이스 실행 계획은 데이터베이스 시스템에 의해 자동으로 생성됩니다.  
대부분의 데이터베이스 시스템은 실행 계획을 생성하기 위해 옵티마이저라는 기능을 사용합니다.  
옵티마이저는 쿼리를 실행하기 전에 다양한 실행 계획을 생성하고, 이 중에서 최적의 실행 계획을 선택합니다.  
최적의 실행 계획은 쿼리 처리에 필요한 시간과 자원을 최소화하면서 결과를 정확하게 반환할 수 있도록 설계됩니다.  
  
실행 계획은 데이터베이스 시스템이 제공하는 모니터링 도구를 통해 확인할 수 있습니다.  
대부분의 데이터베이스 시스템은 실행 계획을 생성하는 동안 사용된 자원(예: CPU, 디스크 I/O, 메모리 등)과 실행 계획의 성능에 관한 정보(예: 쿼리 수행 시간, 처리된 레코드 수 등)를 제공합니다.  
이 정보를 분석하여 쿼리의 성능을 최적화할 수 있습니다.  

옵티마이저(Optimizer)란

옵티마이저는 데이터베이스 시스템이 쿼리 실행 계획을 생성할 때 사용되는 기능입니다.  
쿼리 실행 계획은 쿼리를 처리하는 데 사용되는 인덱스, 테이블 조인 방법, 필터링 조건, 정렬 순서 등을 포함합니다.  
이러한 실행 계획을 생성하는 데 옵티마이저는 다양한 방법을 사용하여 최적의 실행 계획을 선택합니다.  
  
일반적으로 옵티마이저는 두 가지 종류로 나눌 수 있습니다.  
하나는 규칙 기반 옵티마이저이고, 다른 하나는 비용 기반 옵티마이저입니다.  
  
규칙 기반 옵티마이저는 미리 정의된 규칙을 사용하여 실행 계획을 생성합니다.  
예를 들어, 인덱스가 있는 경우 인덱스를 사용하도록 규칙을 정의할 수 있습니다.  
이러한 규칙은 대개 단순하고 빠르게 적용됩니다.  
그러나 모든 쿼리에 대해 최적의 실행 계획을 생성하는 것은 어렵습니다.  
  
반면, 비용 기반 옵티마이저는 실행 계획을 생성하는 데 걸리는 시간과 자원 등의 비용을 고려합니다.  
옵티마이저는 다양한 실행 계획을 생성하고, 이들을 비교하여 최적의 실행 계획을 선택합니다.  
이 방법은 규칙 기반 옵티마이저보다 정확한 실행 계획을 생성할 수 있습니다.  
그러나 실행 계획 생성에 필요한 시간이 더 오래 걸릴 수 있습니다.  
  
따라서, 대부분의 데이터베이스 시스템은 규칙 기반과 비용 기반 옵티마이저를 모두 사용하며, 실행 계획 생성 시간과 성능 최적화 간의 균형을 유지하려고 노력합니다.  

비용기반 옵티마이저(Cost-Based Optimizer, CBO)

비용기반 옵티마이저(Cost-Based Optimizer, CBO)는 SQL 쿼리를 처리하는데 가장 효율적인 방법을 결정하기 위해 쿼리 실행 계획의 비용을 기반으로 하는 옵티마이저입니다.  
이를 위해 옵티마이저는 테이블의 크기, 인덱스 유무, 데이터 분포도 등의 통계 정보를 수집하고, 이를 바탕으로 각 실행 계획의 예상 비용을 산출합니다.  
  
비용기반 옵티마이저는 각 실행 계획의 비용을 산출하기 위해 다양한 요소를 고려합니다.  
예를 들어, 조인 연산을 수행할 때는 조인에 사용되는 테이블의 크기, 인덱스 유무, 조인 조건 등을 고려하여 최적의 실행 계획을 선택합니다.  
인덱스를 사용할 것인지, 테이블 스캔을 할 것인지, 혹은 하이브리드 방식을 사용할 것인지 등의 결정도 비용을 고려하여 이루어집니다.  
  
비용기반 옵티마이저는 SQL 쿼리의 실행 속도를 최적화할 수 있으며, 통계 정보를 토대로 최적의 실행 계획을 선택하므로 정확도 또한 높습니다.  
다만, 이를 위해 많은 통계 정보를 수집해야 하며, 이 과정에서 시스템 자원을 소모하게 됩니다.  
쿼리 실행 계획을 선택하는 과정이 매번 실행될 때마다 발생하므로, 오버헤드가 발생할 수 있습니다.  

규칙기반 옵티마이저(Rule-Based Optimizer, RBO)

규칙기반 옵티마이저(Rule-Based Optimizer, RBO)는 SQL 쿼리의 실행 계획을 결정할 때, 미리 정의된 일련의 규칙에 따라 실행 계획을 생성하는 옵티마이저입니다.  
예를 들어, 조인 연산을 수행할 때는 대부분의 경우 작은 크기의 테이블을 먼저 읽어들이는 것이 효율적이기 때문에 이와 같은 규칙을 적용하여 실행 계획을 생성합니다.  
  
규칙기반 옵티마이저는 실행 계획을 생성하는 데에 있어서 미리 정의된 규칙을 따르기 때문에, 실행 계획을 생성하는 속도가 빠릅니다.  
또한, 실행 계획을 생성하는 과정에서 수집해야 하는 통계 정보가 적기 때문에 시스템 자원을 적게 소모합니다.  
데이터베이스가 작거나 간단한 쿼리를 처리할 때는 비용기반 옵티마이저보다 성능이 우수할 수 있습니다.  
  
하지만, 규칙기반 옵티마이저는 미리 정의된 규칙에 따라 실행 계획을 생성하기 때문에, 통계 정보나 쿼리에 대한 최신 정보를 고려하지 않는 단점이 있습니다.  
데이터가 많거나 복잡한 쿼리를 처리할 때는 비용기반 옵티마이저보다 성능이 떨어질 수 있습니다.  
규칙을 추가하거나 수정할 때는 수동으로 수행해야 하기 때문에 유지보수의 어려움이 있습니다.  

비용기반 옵티마이저와 규칙기반 옵티마이저의 차이

비용기반 옵티마이저와 규칙기반 옵티마이저는 둘 다 데이터베이스 시스템이 쿼리 실행 계획을 생성할 때 사용되는 방법입니다.  
  
규칙기반 옵티마이저는 미리 정의된 규칙을 사용하여 실행 계획을 생성합니다.  
예를 들어, 인덱스가 있는 경우 인덱스를 사용하도록 규칙을 정의할 수 있습니다.  
이러한 규칙은 대개 단순하고 빠르게 적용됩니다.  
그러나 모든 쿼리에 대해 최적의 실행 계획을 생성하는 것은 어렵습니다.  
규칙기반 옵티마이저는 일반적으로 간단한 쿼리나 작은 데이터베이스에 사용됩니다.  
  
반면, 비용기반 옵티마이저는 실행 계획을 생성하는 데 걸리는 시간과 자원 등의 비용을 고려합니다.  
옵티마이저는 다양한 실행 계획을 생성하고, 이들을 비교하여 최적의 실행 계획을 선택합니다.  
이 방법은 규칙기반 옵티마이저보다 정확한 실행 계획을 생성할 수 있습니다.  
그러나 실행 계획 생성에 필요한 시간이 더 오래 걸릴 수 있습니다.  
비용기반 옵티마이저는 일반적으로 대형 데이터베이스 시스템에 사용됩니다.  
  
비용기반 옵티마이저는 쿼리 실행 시간과 자원 사용량을 최적화할 수 있으며, 새로운 쿼리나 새로운 테이블에 대한 쿼리를 처리하는 데도 더 적합합니다.  
그러나 규칙기반 옵티마이저는 실행 계획 생성 시간이 짧고 쿼리를 더 빠르게 처리할 수 있으므로, 간단한 쿼리나 작은 데이터베이스에 적합합니다.  
  
대부분의 데이터베이스 시스템은 규칙기반과 비용기반 옵티마이저를 모두 사용하며, 실행 계획 생성 시간과 성능 최적화 간의 균형을 유지하려고 노력합니다.