
위 문제를 진행하며 겪은 쿼리의 개선과정을 공유합니다.
1.1 문제 설명
실험실에서 배양된 대장균 개체들의 정보를 담은 ECOLI_DATA 테이블에서 "2번 형질(0010)을 보유하지 않으면서 1번(0001) 또는 3번(0100) 형질을 보유"하고 있는 대장균 개체의 수를 계산하는 SQL 쿼리를 작성해야 합니다.
1.2 형질 표현 방식
각 대장균 개체는 1, 2, 3, 4의 4가지 형질을 0 또는 1로 나타낸 2진수 형태로 표현됩니다.
예시:
1.3 쿼리 요구사항
SELECT
COUNT(ID) AS "COUNT"
FROM
ECOLI_DATA
WHERE
(((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0) AND (GENOTYPE & 2) = 0)
2.1 쿼리 설명
GENOTYPE 속성에 저장된 형질 정보를 비트 연산을 사용하여 분석합니다.AND 연산과 OR 연산을 사용하여 2번 형질을 보유하지 않으면서 1번 또는 3번 형질을 보유하는 조건을 만족하는 레코드를 필터링합니다.COUNT 함수를 사용하여 필터링된 레코드의 개수를 계산합니다.SELECT
COUNT(*) AS "COUNT"
FROM
(
SELECT
ID
FROM
ECOLI_DATA
WHERE
(((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0) AND (GENOTYPE & 2) = 0)
) AS SUBQUERY
3.1 개선 내용
SUBQUERY를 사용하여 2번 형질을 보유하지 않으면서 1번 또는 3번 형질을 보유하는 대장균 개체의 ID만 추출합니다.ID만 사용하여 COUNT 함수를 통해 개체 수를 계산합니다.3.2 개선 효과
SUBQUERY를 사용하여 쿼리 실행 계획을 최적화하여 성능 향상을 기대할 수 있습니다.4.1 테스트 환경
4.2 실행 시간 비교
| 레코드 수 | 쿼리 | 실행 시간 (초) | 감소율 |
|---|---|---|---|
| 1만 | 기존 쿼리 | 0.24 | - |
| SUBQUERY 쿼리 | 0.24 | 0% | |
| 1억 | 기존 쿼리 | 145.00 | - |
| SUBQUERY 쿼리 | 85.00 | 41% |
4.3 실행 계획 비교( 10억개의 레코드 일 때 )
| 단계 | 기존 쿼리 | SUBQUERY 사용 쿼리 | 비교 |
|---|---|---|---|
| 1. 전체 데이터 스캔 | 10억 레코드 스캔 (2000.00 단위 비용) | 10억 레코드 스캔 (200.00 단위 비용) | 10배 감소 |
| 2. 조건 필터링 | 조건에 맞는 레코드 필터링 (2000.00 단위 비용) | 조건에 맞는 레코드 필터링 후 ID 추출 (200.00 단위 비용) | 10배 감소 |
| 3. 결과 집계 | ID와 개수 계산 (2000.00 단위 비용) | ID 기반 개수 계산 (1.00 단위 비용) | 2000배 감소 |
4.4 경제성 분석( 10억개의 레코드 일 때 )
| 쿼리 | 총 비용 | 주요 비용 절감 요인 |
|---|---|---|
| 기존 쿼리 | 4000.00 단위 | - |
| SUBQUERY 사용 쿼리 | 421.00 단위 | 조건 필터링 비용 10배 감소 결과 집계 비용 2000배 감소 |
4.5 분석
4.6 추가 고려 사항
5.1 SUBQUERY 특징
5.2 SUBQUERY 사용하기 좋은 상황
5.3 SUBQUERY 사용 시 주의 사항
SUBQUERY는 적절하게 사용하면 쿼리 성능을 향상시키고 코드 가독성을 높일 수 있는 유용한 도구이지만, 과도한 사용은 오히려 역효과를 초래할 수 있으므로 주의해야 합니다.