728x90
반응형

Development/Database 7

Oracle DB 성능 튜닝 공부 DAY5 — 서브쿼리와 Query Transformation 이해하기

Oracle DB 성능 튜닝 DAY5에서는 서브쿼리를 Oracle이 내부적으로 어떻게 처리하고 최적화하는지를 중심으로 공부했다.SQL을 작성하다 보면 IN, EXISTS, 스칼라 서브쿼리, 인라인 뷰, WITH절 등을 자주 사용한다.그런데 우리가 작성한 SQL의 형태와 Oracle이 실제로 실행하는 형태가 항상 같은 것은 아니다.Oracle Optimizer는 필요에 따라 SQL을 내부적으로 변환하는 Query Transformation을 수행한다.이번 DAY5에서는 이러한 변환이 실행계획에 어떤 영향을 주는지 직접 비교해봤다.1. 날짜 데이터와 결합 인덱스먼저 날짜 데이터를 이용한 테이블을 생성했다.CREATE TABLE TDT ASSELECT DT,TO_CHAR(DT,'YYYY') AS YYYY,TO..

Oracle DB 성능 튜닝 공부 DAY4 — 조인 방식과 실행계획 최적화

Oracle DB 성능 튜닝 DAY4에서는 지금까지 배웠던 인덱스와 실행계획을 바탕으로 조인을 어떻게 효율적으로 수행할 것인가를 공부했다.특히 이번에는 단순히 JOIN 문법을 공부하는 것이 아니라,어떤 테이블을 먼저 읽을 것인지Nested Loops와 Hash Join 중 무엇을 사용할 것인지인덱스가 조인 성능에 어떤 영향을 주는지옵티마이저가 실행 중 계획을 변경할 수 있는지불필요한 테이블 접근 자체를 제거할 수 있는지를 실행계획을 통해 확인했다.1. 힌트를 작성했는데 왜 적용되지 않을까?다음 SQL을 보면 EMP 테이블의 인덱스를 사용하도록 힌트를 작성했다. SELECT /*+ INDEX(EMP EMP_HIREDATE_IX) */EMPNO, ENAME, HIREDATEFROM EMP EWHERE HIR..

Oracle DB 성능 튜닝 공부 DAY3 — 인덱스부터 PGA, 테이블 액세스 최적화까지

Oracle DB 성능 튜닝 교육 DAY3에서는 DAY2에서 배웠던 실행계획과 인덱스에서 조금 더 깊게 들어가 실제로 SQL 성능을 결정하는 요소들을 공부했다.이번 교육의 핵심은 크게 세 가지였다.인덱스를 사용한다고 무조건 빠른 것은 아니다.메모리가 부족하면 SORT나 HASH 연산에서 디스크 I/O가 발생한다.SQL 튜닝에서는 결국 불필요한 테이블 접근과 작업량을 얼마나 줄이느냐가 중요하다.이번 글에서는 DAY3에서 공부한 내용을 정리해본다.1. 인덱스와 ROWID의 관계먼저 ROWID의 구조부터 확인했다.SELECT employee_id, last_name, rowid, DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) AS FILE_NO, ..

Oracle DB 성능 튜닝 공부 DAY2 — 실행계획과 인덱스 제대로 이해하기

Oracle DB 성능 튜닝 교육 DAY2에서는 전날 배웠던 옵티마이저와 실행계획 개념에서 한 단계 더 들어가 실제 실행계획을 확인하고 인덱스가 어떻게 사용되는지를 공부했다.특히 이번 교육에서 중요하게 느꼈던 부분은 단순히"인덱스를 만들면 SQL이 빨라진다."가 아니라는 점이었다.같은 SQL이라도 데이터의 분포나 조건에 따라 TABLE FULL SCAN이 유리할 수도 있고 INDEX RANGE SCAN이 유리할 수도 있다.또한 WHERE절을 어떻게 작성하느냐에 따라 이미 존재하는 인덱스를 제대로 활용하지 못할 수도 있다.이번 글에서는 DAY2에서 공부한 내용을 정리해본다.1. 실행계획(Execution Plan)이란?SQL을 작성하면 Oracle의 옵티마이저가 데이터를 어떤 방법으로 가져올 것인지 결정한..

Oracle SQL 튜닝 공부 DAY1 - 데이터베이스 구조부터 Parse와 실행계획까지

Oracle SQL 튜닝 교육 첫날에는 Oracle 데이터베이스의 기본 구조, SGA와 PGA, SQL 문장 처리 과정, Hard Parse와 Bind Variable, 그리고 Optimizer와 실행계획까지 전체적인 흐름을 공부했다.SQL 튜닝을 공부하기 전에 먼저 Oracle 내부에서 SQL이 어떤 과정을 거쳐 실행되는지 이해하는 것이 중요하다.1. Oracle 데이터베이스 서버 구조Oracle 데이터베이스 서버는 크게 다음 두 부분으로 구성된다.Oracle Database Server = Instance + Database여기서 Instance는 다시 다음과 같이 구성된다.SGA(System Global Area)Background ProcessSGA는 여러 프로세스가 함께 사용하는 공유 메모리 영..

[Oracle / 오라클] Oracle 함수에서 SELECT INTO가 필요한 이유

📌 Oracle 함수에서 SELECT INTO가 필요한 이유데이터베이스에서 SELECT는 원하는 데이터를 테이블에서 꺼내오는 기본 명령어예요.근데 SELECT만 쓰면 결과가 집합(표 형태) 으로 나옵니다.예를 들어, SQL Developer 같은 툴에서 SELECT * FROM 테이블 하면 표가 뜨죠.하지만 PL/SQL 함수나 프로시저 안에서는 다릅니다.함수(Function): 결과를 하나의 값으로 반환해야 함프로시저(Procedure): 변수나 OUT 파라미터로 값을 내보냄그래서 SELECT 결과를 변수에 담아야다음 로직에서 가공하거나 RETURN 할 수 있어요.✅ SELECT INTO는 무조건 한 건만 반환해야 함중요한 특징:SELECT INTO는 결과가 하나면 OK.결과가 없으면 → NO_DATA..

[Oracle / 오라클] XMLAGG, XMLELEMENT 함수로 다수 검사자/진단명 1행으로 병합하기 (HIS 시스템 기준)

병원 전산시스템(HIS)에서는 하나의 검사나 진료 건에 대해 여러 명의 의료진이나 다수의 진단명이 연관된 경우가 많습니다. 이런 경우, 다수 레코드를 하나의 문자열로 병합해서 보여주는 SQL이 필요합니다.오늘은 Oracle의 XMLELEMENT, XMLAGG 함수를 활용하여 1건의 검사에 여러 검사자 이름을 쉼표로 연결해 한 줄로 표현하는 방법을 소개하겠습니다.💡 적용 배경 (병원 HIS 예시)한 환자 진료 건에서 여러 진단명이 함께 내려진 경우한 건의 병리 검사를 여러 명의 병리사 또는 검사자가 분담 처리한 경우한 건의 처방 오더에 여러 명의 의료진이 관여한 이력 표시→ 이런 데이터는 병원 DB에서 1:N 구조로 존재하며, UI 또는 보고서에서 "한 줄로" 표현되어야 합니다.📌 1. XMLELEME..

728x90
반응형