본문 바로가기

반응형

전체 글

[Oracle SQL] 실수로 지운 데이터 복구 – FLASHBACK QUERY(AS OF TIMESTAMP)와 휴지통 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능WHERE 조건을 잘못 써서 지우면 안 되는 데이터를 DELETE하고 COMMIT까지 해 버렸다면? 백업에서 복원하기 전에 먼저 시도할 방법이 있습니다. Oracle은 변경 전 데이터를 UNDO 영역에 일정 시간 보관하기 때문에, 그 시간 안이라면 과거 시점의 데이터를 SELECT로 조회해서 되살릴 수 있습니다. 상황별 복구 방법을 정리합니다.가장 중요한 원칙은 "빨리"입니다. 시간이 지날수록 과거 데이터가 UNDO에서 밀려나 복구할 수 없게 됩니다. 실수를 알아챘다면 이 글을 끝까지 읽기 전에 4번의 백업 테이블부터 만드세요.1. 예제 상황목차 글의 공통.. 더보기
[Oracle SQL] 느린 쿼리 점검 – 실행 계획 보는 법(DBMS_XPLAN)과 인덱스를 못 타는 패턴 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능같은 결과를 내는 쿼리라도 1초 만에 끝나기도 하고 몇 분씩 걸리기도 합니다. 차이는 대부분 "Oracle이 데이터를 어떤 길로 읽었는가", 즉 실행 계획에서 드러납니다. 튜닝 전문가가 아니어도 실행 계획을 보고 "인덱스를 안 타는구나" 정도만 알아채면 많은 문제를 직접 해결할 수 있습니다. 실행 계획 보는 법과 인덱스를 못 쓰게 만드는 대표 패턴을 정리합니다.1. 실행 계획 보기 – EXPLAIN PLAN + DBMS_XPLANEXPLAIN PLAN FORSELECT order_id, order_dt, amount FROM orders WHERE cus.. 더보기
[Oracle SQL] 테이블·컬럼·인덱스 정보 조회 – 데이터 딕셔너리로 테이블 정의서 만들기 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능처음 보는 시스템의 데이터를 뽑아야 할 때, 감사나 인수인계 때문에 테이블 정의서를 만들어야 할 때 가장 먼저 쓰는 것이 데이터 딕셔너리 뷰입니다. Oracle은 테이블·컬럼·인덱스·제약 조건 정보를 모두 조회 가능한 뷰로 제공합니다. 실무에서 바로 쓰는 쿼리만 모았습니다.1. USER_ · ALL_ · DBA_ 차이접두어보이는 범위예USER_내 계정(스키마)이 소유한 객체USER_TABLES, USER_TAB_COLUMNSALL_내가 조회 권한을 가진 모든 객체 (다른 스키마 포함, OWNER 컬럼 있음)ALL_TABLES, ALL_TAB_COLUMNSD.. 더보기
[Oracle SQL] 행을 열로 바꾸기 – SUM(CASE), PIVOT, UNPIVOT으로 월별 가로 보고서 만들기 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능월별 실적을 뽑아 달라는 요청에 GROUP BY 결과(고객 × 월이 세로로 길게 나열)를 주면 대부분 "엑셀처럼 월을 가로로 펼쳐 달라"는 답이 돌아옵니다. 행을 열로 바꾸는 방법은 모든 버전에서 되는 SUM(CASE) 방식과 11g부터 쓸 수 있는 PIVOT 두 가지가 있습니다. 합계 행·합계 열 추가와 반대 방향인 UNPIVOT까지 정리합니다.1. 예제 테이블예제는 아래 주문 테이블(ORDERS)로 진행합니다. 스크립트를 그대로 실행하면 같은 결과를 확인할 수 있습니다. (Oracle 실무 쿼리 시리즈 공통 예제)CREATE TABLE orders ( .. 더보기
[Oracle SQL] 중복 데이터 찾기와 삭제 – GROUP BY HAVING, ROW_NUMBER, ROWID로 1건만 남기기 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능엑셀 파일을 여러 번 업로드했거나, 인터페이스가 재전송되면서 같은 데이터가 두세 번 들어가는 일이 생깁니다. PK가 일련번호라 DB는 막아 주지 않습니다. 중복을 찾고, 한 건만 남기고 지우고, 다시 생기지 않게 막는 순서로 정리합니다.1. 예제 테이블회원 임시 테이블에 같은 사람(이름 + 전화번호)이 여러 번 들어간 상황입니다.CREATE TABLE member_tmp ( mem_id NUMBER, mem_nm VARCHAR2(50), phone VARCHAR2(20), reg_dt DATE);INSERT INTO membe.. 더보기
[Oracle SQL] MERGE INTO 사용법 – 있으면 UPDATE, 없으면 INSERT (단건 UPSERT·테이블 동기화) 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능"이미 있는 데이터면 수정하고, 없으면 새로 넣어 주세요." 개발하다 보면 정말 자주 만나는 요구입니다. SELECT로 먼저 확인한 뒤 UPDATE와 INSERT를 나눠 실행하면 쿼리가 세 번 돌고, 동시에 요청이 들어오면 중복 오류도 납니다. Oracle의 MERGE INTO 한 문장으로 처리하는 방법을 정리합니다.1. 예제 테이블CREATE TABLE product ( prod_cd VARCHAR2(10) PRIMARY KEY, prod_nm VARCHAR2(50), price NUMBER, upd_dt DATE);IN.. 더보기
[Oracle SQL] 계층형 쿼리 CONNECT BY – 조직도·메뉴 트리, 경로 표시, 날짜 목록 만들기 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능부서·메뉴·카테고리처럼 "상위 항목 ID"를 가진 테이블은 트리 구조로 조회해야 하는 경우가 많습니다. Oracle의 CONNECT BY를 쓰면 몇 단계든 한 번에 펼칠 수 있습니다. 같은 문법으로 날짜 목록을 만들어 "데이터가 없는 날도 0으로 표시"하는 방법까지 정리합니다.1. 예제 테이블 (부서)CREATE TABLE dept ( dept_id NUMBER PRIMARY KEY, dept_nm VARCHAR2(50), parent_id NUMBER, -- 상위 부서 (최상위는 NULL) sort_no .. 더보기
[Oracle SQL] 문자열 함수 실무 – SUBSTR, INSTR, LPAD, 마스킹, LISTAGG, 쉼표 구분 값 행으로 나누기 환경 : Oracle 11g 이상 (12c 이상에서만 되는 기능은 따로 표시) / SQL Developer, DBeaver 등 어떤 툴에서든 실행 가능데이터 추출 요청을 받다 보면 "이메일 도메인별로 묶어 주세요", "전화번호 형식을 통일해 주세요", "이름은 가운데 글자를 가려서 주세요", "주문번호를 한 칸에 쉼표로 이어 주세요" 같은 문자열 작업이 꼭 붙습니다. 실무에서 자주 쓰는 문자열 함수를 예제와 함께 정리합니다.1. 예제 테이블고객 테이블(CUSTOMER)과 주문 테이블(ORDERS)을 사용합니다. 전화번호는 하이픈이 있는 것과 없는 것이 섞여 있습니다.CREATE TABLE customer ( cust_id VARCHAR2(10) PRIMARY KEY, cust_nm VA.. 더보기

반응형