728x90

DB 8

[Oracle] Where절에서 괄호 우선순위가 동작하지 않는 경우 (옵티마이저)

이슈)현업 요청으로 개발 중,,, 조건절에 아래와 같이 작성했다....WHERETABLE.COLUMN_A = VALUE1 AND(TABLE.COLUMN_B = VALUE2 AND TABLE.COLUMN_C = VALUE3)... 내가 의도한건 괄호에 있는 조건을 먼저 검사를 하게끔 한 것인데, 실제 쿼리를 돌려보니...WHERETABLE.COLUMN_A = VALUE1 ANDTABLE.COLUMN_B = VALUE2 AND TABLE.COLUMN_C = VALUE3...이것과 똑같이 동작을 했다... 확인을 해보니SQL에 WHERE절의 괄호는 논리적인 평가 순서만 바꿔주고, 옵티마이저가 조건을 실제로 어떻게 적용하는지까지는보장해주질 않는다고 한다... DBMS에서 AND/OR 조건을 최적화에서 인덱스 활..

DB/Oracle 2025.10.16

[Oracle] WITH절이란? (기본 사용법부터 재귀적 WITH절까지)

이슈)새로운 개발 건 때문에 부하 정도를 러프하게라도 알아보려고 일주일치에 대한 통계를 내는 쿼리를 작성을 하던 도중,,,실행 계획을 보니 빨간 글자가 너무 많았다.(대충 쿼리를 잘못짜서 실행하면 속 터진다... 라는 일종의 경고문..)쿼리 구조는 테이블 A에 있는 값과 테이블 B, C, D 각각을 join 하고 group by를 사용해 집계함수를 쓰는 것이였다.속도가 너무 느려 방법이 없을까 하다가 WITH절을 사용했는데 한번 정리해본다. WITH절→ 쿼리 앞부분에 하위 쿼리를 미리 정의해두고, 이후 메인 쿼리에서 미리 정의한 쿼리를 참조할 수 있게 해준다.일종의 임시 뷰(temporary view) 역할을 한다고 생각하면 된다. 장점쿼리 가독성 향상 : 복잡한 서브쿼리를 여러 번 쓰지 않고, 이름을 ..

DB/Oracle 2025.10.16

[Oracle] EXISTS 란?

이슈)쿼리를 보다 보면, EXISTS 구문이 있다.말 그래도 존재 여부를 따지는 문법인데, 가끔 보면 이상하게 정리가 안될 때가 있다.그래서 한번 정리를 해본다. EXISTS란?→ 서브쿼리의 결과 존재 여부를 판단하여 메인 쿼리의 결과를 제어하는 조건문→ 즉, EXISTS는 서브쿼리의 결과가 하나라도 있으면 TRUE 없으면 FALSE를 반환※ NOT EXISTS → 반대로 존재하지 않는 경우만 찾을 때 사용SELECT 컬럼명FROM 테이블A AWHERE EXISTS ( SELECT 1 FROM 테이블B B WHERE B.컬럼 = A.컬럼); 이렇게 보면 IN과 EXISTS가 비슷하다고 볼 수 있는데, 아래 차이를 봐보자구분 EXISTS IN비교 기준존재 여부값 목록 포함 여부성능서브쿼리 ..

DB/Oracle 2025.10.16

[Oracle] NVL, DECODE, COALESCE

이슈)오늘은 쿼리 분석 중에 NVL 함수가 있었는데, 인자가 한개가 아닌 두개가 있었다.순간 뭐지.. 라고 고민을 했기에 이렇게 정리를 해본다... DECODE와 COALESECE 함수는 덤으로 정리한다! NVL 함수→ 컬럼 값이 NULL 일 경우, 지정한 값으로 치환해 준다. (NULL 이 아니면 원래 값을 그대로 반환)NVL(컬럼명, 대체값)※ 데이터 타입 일치 필요 : 첫번째 인자와 두번째 인자는 동일하거나 호환 가능한 타입이어야 함. DECODE 함수→ 조건 비교 후 값 반환 ( 간단한 IF-ELSE 또는 CASE WHEN 역할 가능)DECODE(표현식, 비교값1, 반환값1, 비교값2, 반환값2, ..., 기본값)표현식이 각 비교값과 일치하면 해당 반환값 반환아무것도 일치하지 않으면 마지막 기본값..

DB/Oracle 2025.10.16

[Oracle] 옵티마이저 힌트 LEADING 과 INDEX_SS

이슈)오늘 현업분께 요청이 왔다. 어떠한 화면에서 조회할 수 있는 기간을 한달로 늘려줄 수 없냐는 문의였다.근데 해당 화면에서 조회할 때 사용되는 테이블들이 데이터 양도 많고, 조회기간을 늘리면 자칫 운영 환경에서 타임아웃이 발생할 수 있기 때문에 확인을 해보고 말씀드린다고 했다. 그래서 쿼리를 뜯어보고 있는데,,, 옵티마이저 힌트 부분에 아래와 같은 구문이 있었다.../*+ LEADING(table1 table2) INDEX_SS(table1 index1)*/ 나름 쿼리를 튜닝해보려고 했지만, 저 힌트를 제대로 이해하지 못했다..그래서 정리를 해본다. LEADING 힌트→ Join 순서를 지정하는 힌트Oracle 옵티마이저는 조인 순서를 자동으로 결정하지만, 어떤 경우에서 사용자가 더 효율적인 순서를..

DB/Oracle 2025.10.16

[Oracle] INSERT 내부에 SELECT절

최근 개발하는 것 중 테이블에 신규 컬럼 추가가 필요해서 추가를 하였다. 분명 관련 테이블 쿼리 중 영향도가 있을만한 것을 검토하고 반영을 했는데, 오류가 발생했다...`ORA-00947: not enough values ...`insert 할 때, 테이블의 컬럼 수를 못채운 상태로 작업을 해서 발생한 오류이다. 오류난 쿼리를 보니깐 아래 쿼리에서 발생한 오류였다./*기존 TABLE1의 컬럼 = PK1, COL1, COL2현재 TABLE1의 컬럼 = PK1, COL1, COL2, COL3*/-- 오류가 발생한 쿼리INSERT INTO TABLE1( SELECT A.PK1 + 1, -- PK가 값이 다른 상태로 넣는다는 것을 표현 A.COL1, A.COL2 F..

DB/Oracle 2025.10.16

[Oracle] 병렬처리 parallel

회사에서 개발/테스트 환경에서 사용하는 테이블 중, 특정 컬럼 값을 null로 update 하는 작업이 있었다.근데 내 파트쪽 테이블 데이터 수가 적은건 100만개,,, 많게는 1억개 정도 됐던걸로 확인을 했다.다른 파트들에서도 작업을 해서 그런지 select 뿐만 아니라 update 자체도 오래걸렸다... 그래서 pk를 나눠서 처리를 하던 도중 사수님이 UPDATE문에/*+ enable_parallel_dml parallel(10) */ 힌트를 추가하고 실행해보라고 하셨다.역시,,, 이렇게 하니깐 실행 시간이 엄청 줄여서 처리를 할 수 있었다!parallel의 경우, 시스템 자원을 끌어다 써서 최대 효율을 내는 것인데, 당연히 운영이나 서비스에서 사용하면 안되는 작업(시스템 자원을 많이 잡아먹기 때문에..

DB/Oracle 2025.10.16

[Maria] Cursor 사용하기

Cursor : 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리 공간 Fetch : 커서에서 원하는 결과값을 추출하는 것 Cursor의 경우 프로시저 내부에서 사용이 가능하다. 선언하는 부분 DECLARE x INT; -- Cursor에 저장된 각 행을 받아서 저장할 변수 DECLARE done INT DEFAULT FALSE; -- done : cursor에 더 이상 조회할 행 존재 여부를 표시해주는 변수이다. DECLARE cur1 CURSOR FOR SELECT i FROM test.c1; -- SELECT i FROM test.c1 로 조회한 행들을 cur1로 선언한 CURSOR에 저장을 한다. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;..

DB/Maria, MySql 2024.01.23
728x90