
1. 다차원 데이터 필터링의 핵심: 논리 연산자의 이해
2화에서 우리는 SELECT, FROM, WHERE 구문을 활용해 대용량 테이블에서 안전하게 샘플 데이터를 추출하고 기본적인 단일 조건을 필터링하는 메커니즘을 살펴보았습니다. 현업 실무 환경에서는 단 하나의 조건만으로 데이터를 추출하는 경우가 그리 많지 않습니다. 현업의 요구사항은 언제나 복잡하며 다차원적인 기준을 요구하곤 합니다.
예를 들어 “특정 지역에 거주하면서 동시에 특정 금액 이상 구매한 고객” 혹은 “최근 3개월간 로그인을 하지 않았거나 탈퇴 대기 상태인 회원”처럼 여러 개의 조건을 유기적으로 결합해야 하는 상황이 대부분입니다. 이때 우리가 필수로 사용해야 하는 도구가 바로 비교 연산자(=, >, <, >=, <=, <>)와 논리 연산자(AND, OR, NOT)입니다.
많은 입문자는 비교 연산자와 논리 연산자의 개념이 직관적이기 때문에 쉽게 사용할 수 있다고 생각하는 경향이 있습니다. 그러나 기업형 대용량 DW 환경에서는 여러 논리 연산자가 복합적으로 얽힐 때, 연산자 간의 처리 우선순위(Precedence)를 명확히 인지하지 못하면 완전히 엉뚱한 데이터 집합을 추출하게 되는 치명적인 분석 오류를 범할 수 있습니다.
2. 논리 연산자의 종류와 테라데이터 내장 메커니즘
기본적인 논리 연산자의 정의와 데이터베이스 엔진 내부에서 판별하는 속성을 객관적으로 짚고 넘어가겠습니다.
- AND 연산자: 결합된 모든 조건이 참(
TRUE)일 때만 최종 참을 반환합니다. AND 연산자는 여러 조건을 모두 만족하는 데이터만 조회하므로 결과 집합을 좁히는 역할을 합니다. 조건의 선택도와 인덱스 활용 여부에 따라 데이터베이스가 효율적인 실행 계획을 수립하는 데 도움이 될 수 있습니다. - OR 연산자: 결합된 조건 중 하나라도 참(
TRUE)이면 최종 참을 반환합니다. 데이터의 범위를 넓히는 합집합 역할을 하며, 경우에 따라 옵티마이저가 효율적인 접근 경로를 선택하기 어려워질 수 있으므로, 조건 구성에 따라 성능에 영향을 줄 수 있습니다. - NOT 연산자: 뒤따르는 조건의 진릿값을 반전시킵니다. 참은 거짓으로, 거짓은 참으로 변환합니다.
특히 테라데이터 환경에서는 데이터베이스 내에 존재하는 NULL(데이터가 없음) 값과 논리 연산자가 만났을 때 3가 진수 논리(Three-Valued Logic)가 적용되어 TRUE, FALSE가 아닌 UNKNOWN 상태를 반환할 수 있으므로 주의가 요구됩니다. 이 부분은 6화(NULL 처리)에서 심도 있게 다룰 예정입니다.
3. 현업 비즈니스 사례로 보는 WHERE절 다중 조건 오류
논리 연산자의 결합 시 발생할 수 있는 가장 대표적인 실무적 리스크를 이해하기 위해, 실제 금융권이나 이커머스 마케팅 부서에서 빈번하게 일어나는 가상의 금융 마케팅 타겟 추출 사례를 살펴보겠습니다.
[실무 사례 예시: 마케팅 팀 최 대리의 타겟 추출 사고]
F 금융사의 데이터 분석 담당자인 최 대리는 마케팅 팀으로부터 급한 우수 고객 대상 이벤트 타겟 명단 추출 요청을 받았습니다.
- 요청 내용: “당사 회원 중 거주지역이 ‘부산(BUSAN)’ 또는 **’대구(TAEGU)’**이면서, 동시에 신용등급이 **’우수(01)’**인 고객의 명단을 뽑아주세요.”
최 대리는 요청 조건을 읽고 직관적으로 다음과 같이 쿼리를 작성하여 실행했습니다. 결과 데이터가 정상적으로 출력되는 것을 확인하고 마케팅 팀에 전달했습니다.
-- [주의] 괄호 배치 누락으로 인해 심각한 타겟 오류를 유발하는 위험한 쿼리
SELECT
CUST_NO
, AREA_CODE
, CREDIT_RATING_CD
FROM
DW_MART.CUSTOMER_MASTER
WHERE
AREA_CODE = 'BUSAN'
OR AREA_CODE = 'TAEGU'
AND CREDIT_RATING_CD = '01';
무엇이 문제였을까? (연산자 우선순위의 함정)
마케팅 팀은 전달받은 명단을 바탕으로 프로모션을 진행하던 중, 신용등급이 ‘일반(03)’이거나 ‘주의(05)’인 고객들에게도 우수 고객 혜택 안내 문자가 대량 발송되었다는 항의를 접수했습니다. 확인 결과, 최 대리가 작성한 쿼리가 논리적으로 마케팅 팀의 의도와 다르게 작동했음이 밝혀졌습니다.
SQL 표준에서는 논리 연산자의 처리 우선순위가 NOT -> AND -> OR 순서로 규정되어 있습니다. 즉, 괄호가 명시되지 않은 상태에서 AND와 OR가 공존하면 데이터베이스는 AND 조건을 먼저 묶어서 처리합니다. 최 대리가 쿼리를 실행했을 때 테라데이터 옵티마이저는 해당 조건을 다음과 같은 논리 구조로 해석한 것입니다.
-- 데이터베이스가 실제로 해석한 논리 구조
WHERE
AREA_CODE = 'BUSAN'
OR (AREA_CODE = 'TAEGU' AND CREDIT_RATING_CD = '01');
이 구조로 쿼리가 돌아가면 시스템은 다음 두 가지 부류의 데이터를 모두 추출하게 됩니다.
- 거주지역이 ‘대구’이면서 신용등급이 ‘우수(01)’인 고객 (의도에 부합)
- 거주지역이 ‘부산’이기만 하면 신용등급과 관계없이 모든 고객 (의도와 다름)
결과적으로 부산에 거주하는 수많은 일반 및 위험 등급 고객들이 명단에 대거 포함되는 비즈니스 사고로 이어진 것입니다.
4. 올바른 다중 조건 처리법: 명시적 괄호(())의 활용
이러한 논리적 오류를 완벽하게 차단하고 마케팅 팀의 원래 요구사항을 정확하게 반영하기 위해서는, OR 연산자로 묶인 조건 그룹을 명시적 괄호()로 감싸주어 우선순위를 강제해야 합니다.
-- [올바른 예시] 명시적 괄호를 사용해 요구사항을 정확히 반영한 쿼리
SELECT
CUST_NO
, AREA_CODE
, CREDIT_RATING_CD
FROM
DW_MART.CUSTOMER_MASTER
WHERE
(AREA_CODE = 'BUSAN' OR AREA_CODE = 'TAEGU') -- 거주지 조건 그룹을 먼저 연산
AND CREDIT_RATING_CD = '01'; -- 등급 조건을 최종 결합
이렇게 괄호를 지정해주면 데이터베이스 엔진은 괄호 안의 OR 연산(부산 또는 대구 고객 확인)을 먼저 수행하여 대상 데이터 집합을 만든 뒤, 그 집합 안에서 신용등급이 ’01’인 행들만 최종 필터링합니다. 이처럼 다중 조건을 다룰 때는 쿼리 작성자가 연산자 우선순위를 과신하기보다, 인간과 시스템 모두가 오해하지 않도록 괄호를 명확하게 표기하는 습관이 실무 안정성 관점에서 매우 중요하다고 평가받습니다.
5. 테라데이터 환경에서의 성능(Performance) 관점 점검
대용량 데이터를 분산 병렬 처리하는 테라데이터 환경에서는 WHERE 절에 AND와 OR를 어떻게 배치하느냐에 따라 연산 속도와 서버 부하의 격차가 크게 벌어질 수 있습니다.
- AND 조건의 최적화 유도: 테라데이터는 테이블 분산의 기준이 되는 인덱스(Primary Index, PI) 칼럼이 존재합니다. 만약 WHERE 절에서 Primary Index를 등가(=) 조건으로 조회할 수 있다면, 데이터가 저장된 AMP를 직접 찾아가는 효율적인 접근이 가능해질 수 있습니다.
- OR 조건의 과도한 사용 지양: 반면 동일 칼럼이 아닌 서로 다른 칼럼들을 OR로 묶어 다중 조건을 걸게 되면, 조건 구성에 따라 테라데이터 옵티마이저가 효율적인 접근 경로를 선택하기 어려워질 수 있습니다. 이 경우 실행 계획에 따라 전체 테이블을 읽는(Table Scan) 방식이 선택될 가능성이 높아질 수 있으므로, 조건이 복잡한 경우에는 차후 연재될 IN 구문이나 UNION ALL 등의 대안도 함께 검토하는 것이
6. 결론 및 다음 화 예고
이번 3화에서는 WHERE 절 다중 조건 처리의 핵심인 비교 및 논리 연산자의 활용 메커니즘을 살펴보고, 현업에서 흔히 발생하는 연산자 우선순위 오작동 사례를 통해 명시적 괄호 사용의 중요성을 팩트 체크해 보았습니다. 단순해 보이는 AND와 OR 키워드 한 단어가 실무 데이터 결과물에 큰 영향을 미칠 수 있음을 인지하는 것이 중요합니다.
이어지는 4화에서는 문자열 검색의 스펙트럼을 넓혀주는 패턴 매칭 문법인 LIKE와 와일드카드(%, _), 그리고 대량의 다중 택일 조건을 깔끔하게 정리해 주는 IN 구문 및 BETWEEN 범위 연산자를 상세히 다룹니다. 특히 3화에서 언급한 복잡한 OR 조건 연발 코드를 IN 구문으로 세련되게 리팩토링하여 쿼리의 가독성을 높이고, 상황에 따라 보다 효율적인 실행 계획을 유도하는 방법을 비즈니스 예제와 함께 자세히 파악해 보겠습니다.