* 참고자료

위 문제를 진행하며 겪은 쿼리의 개선과정을 공유합니다.

1. 문제의 요구사항: 10진수로 표현된 형질을 비트 연산으로 추출

1.1 문제 설명

실험실에서 배양된 대장균 개체들의 정보를 담은 ECOLI_DATA 테이블에서 "2번 형질(0010)을 보유하지 않으면서 1번(0001) 또는 3번(0100) 형질을 보유"하고 있는 대장균 개체의 수를 계산하는 SQL 쿼리를 작성해야 합니다.

1.2 형질 표현 방식

각 대장균 개체는 1, 2, 3, 4의 4가지 형질을 0 또는 1로 나타낸 2진수 형태로 표현됩니다.

예시:

  • ID 1: 1000 (2진수) - 1번 형질만 보유
  • ID 2: 1111 (2진수) - 1, 2, 3, 4번 형질 모두 보유
  • ID 3: 0001 (2진수) - 1번 형질만 보유
  • ID 4: 1101 (2진수) - 1, 3, 4번 형질만 보유

1.3 쿼리 요구사항

  • 2번 형질을 보유하지 않으면서 1번 또는 3번 형질을 보유하는 대장균 개체의 수를 계산
  • 1, 3번 형질을 모두 보유하는 경우도 포함

2. 초기 쿼리: SUBQUERY 사용 전 쿼리

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 함수를 사용하여 필터링된 레코드의 개수를 계산합니다.

3. 개선 쿼리: SUBQUERY 사용해 리팩토링된 쿼리

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. 쿼리 경제성 개선: 성능 비교

4.1 테스트 환경

  • 데이터베이스 엔진: MySQL 8.0.27
  • 테이블 데이터:
    • 1만 개 레코드: ECOLI_DATA 테이블
    • 1억 개 레코드: 1만 개 레코드 테이블을 10배 확장

4.2 실행 시간 비교

레코드 수쿼리실행 시간 (초)감소율
1만기존 쿼리0.24-
SUBQUERY 쿼리0.240%
1억기존 쿼리145.00-
SUBQUERY 쿼리85.0041%

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 분석

  • 1만 개 레코드의 경우 두 쿼리의 실행 시간은 동일합니다.
  • 1억 개 레코드의 경우 SUBQUERY 쿼리가 기존 쿼리보다 약 ⚡41% 빠릅니다.
  • 레코드 수가 증가할수록 SUBQUERY 쿼리의 성능 향상 효과가 더욱 두드러집니다.

4.6 추가 고려 사항

  • 데이터베이스 엔진 버전, 테이블 데이터 분포, 인덱스 사용 여부 등에 따라 성능 차이가 발생할 수 있습니다.
  • 쿼리 성능 최적화를 위해서는 데이터베이스 엔진 최적화, 쿼리 리팩토링, 인덱스 활용 등 다양한 방법을 고려해야 합니다.

5. SUBQUERY의 특징 및 사용하기 좋은 환경

5.1 SUBQUERY 특징

  • 다른 쿼리의 결과를 활용하여 계산하거나 필터링하는 데 사용됩니다.
  • 중첩된 쿼리 구조를 만들 수 있지만, 복잡성이 증가 할 수 있습니다.
  • 적절하게 사용하면 쿼리 성능을 향상시키고 코드 가독성을 높일 수 있습니다.

5.2 SUBQUERY 사용하기 좋은 상황

  • 특정 조건에 맞는 데이터를 추출하여 다른 쿼리에 활용해야 하는 경우
  • 데이터를 그룹화하거나 집계해야 하는 경우
  • 복잡한 조건을 처리해야 하는 경우

5.3 SUBQUERY 사용 시 주의 사항

  • 과도하게 사용하면 쿼리 성능 저하를 초래할 수 있습니다.
  • 중첩된 쿼리 구조는 코드 가독성을 저하시킬 수 있습니다.
  • 다른 방법으로 동일한 기능을 구현할 수 있는지 고려해야 합니다.

SUBQUERY는 적절하게 사용하면 쿼리 성능을 향상시키고 코드 가독성을 높일 수 있는 유용한 도구이지만, 과도한 사용은 오히려 역효과를 초래할 수 있으므로 주의해야 합니다.

profile
null

0개의 댓글