본문 바로가기

728x90
반응형

공부 정리/DB

(46)
오라클 조작 명령어 모음(테이블/코멘트/시퀀스/배치) * 테이블 --오라클 테이블 생성 CREATE TABLE emp ( empno NUMBER(4)NOT NULL, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) ); --PK 생성 ALTER TABLE emp ADD CONSTRAINT emp_pk PRIMARY KEY (empno); --인덱스 생성 CREATE INDEX emp_idx01 ON emp(job, deptno); --칼럼 추가 ALTER TABLE TB_INVENTORY_HIS_D ADD email VARCHAR(25) DEFAULT 'test@test.com' NOT NULL..
Oracle에서 NULL처리 개요 DB를 사용하다 보면 항상 NULL과의 싸움입니다. 언제 NULL 위험이 있는지, NULL의 위험이 있는 경우 어떻게 처리해야 하는지 정리합니다. (이 글에서 다루는 칼럼들은 NULL 허용입니다. 그래야 NULL 발생을 대비해 학습할 수 있습니다.) NULL이 발생하는 경우 NULL이 발생하는 경우는 크게 6가지로 구분할 수 있습니다. NULL 허용 칼럼의 값이 NULL일 때 NULL과 조인 아우터조인에서 조인에 실패한 아우터 조인된 테이블의 칼럼 값 스칼라서브쿼리에서 조건에 해당하는 데이터가 없는 경우 메인쿼리의 결과 값 GROUP BY 절 없이 사용한 집계함수에서 조건에 해당하는 데이터가 없을 때 CASE 표현식을 이용한 컬럼 변환에서 처리에 누락되는 컬럽 값 NULL이 발생하는 경우 예제 NU..
제 1,2,3 정규화 개요 데이터 모델링을 하면 무의식적으로 정규화를 합니다. 이를 공식으로 정리한 내용을 배워 개념을 잘 다지기 위해 DB 정규화를 정리합니다. 정규화를 왜 해야 할까? 정규화를 무작정 외우기 전에 먼저 정규화를 왜 해야 하는지, 데이터 모델링의 핵심이 무엇인지 고민해야 합니다. DB 데이터 모델링의 핵심은 '중복을 제거' 입니다. 중복을 제거하지 않으면 이상 현상이 발생하고 데이터를 관리할 수 없습니다. 설계할 때 각 테이블의 데이터를 원자(ATOM) 상태로 모두 쪼개서 1:1, 1:M, M:N 관계를 맺습니다. 이 모든 것이 데이터 중복 현상을 방지하기 위해서입니다. 따라서, 어떻게 데이터 무결성을 지키면서 설계할 수 있을지 고민해야 합니다. 제1 정규화 모든 속성은 반드시 하나의 값을 가져야 합니다. ..
서브쿼리 의존증 서브쿼리의 문제점 서브쿼리의 성능적 문제는 결과적으로 서브쿼리가 실체적인 데이터를 저장하고 있지 않다는 점에서 기인합니다. 이에 따라서 다음과 같은 문제가 발생합니다. 연산 비용 추가 실제적인 데이터를 저장하고 있지 않다는 것은 서브쿼리에 접근할 때마다 SELECT 구문을 실행해서 데이터를 만들어야 한다는 뜻입니다. 따라서 SELECT 구문 실행에 발생하는 비용이 추가됩니다. 서브쿼리의 내용이 복잡하면 복잡할수록 이러한 실행 비용은 더 높아집니다. 데이터 I/O 비용 발생 연산 결과는 어딘가에 저장하기 위해 쌓아두어야 합니다. 메모리 용량이 충분하다면 이러한 오버헤드가 적지만, 데이터양이 큰 경우에는 DBMS가 저장소에 있는 파일에 결과를 쓸 때도 있습니다. TEMP 탈락 현상의 일종인데 저장소 성능에 ..
UNION을 사용한 쓸데없이 긴 표현 UNION을 사용한 조건 분기는 SQL 초보자가 좋아하는 기술 중 하나입니다. 일반적으로 WHERE 구만 조금씩 다른 여러 개의 SELECT 구문을 합쳐서 복수의 조건에 일치하는 하나의 결과 집합을 얻고 싶을 때 사용하니다. 하지만 이런 방법은 성능적인 측면에서 굉장히 큰 단점을 가지고 있습니다. 외부적으로는 하나의 SQL 실행처럼 보이지만, 내부적으로 여러개의 SELECT 구문을 실행하는 실행 계획으로 해석됩니다. 따라서 테이블에 접근하는 횟수가 많아져서 I/O 비용이 크게 늘어납니다. 따라서 SQL에서 조건 분기는 UNION을 사용해도 좋을지 신중히 검토해야 합니다. UNION의 문제점 WHERE 구에서 조건분기하기 2001년도 이하인 경우 price_tax_ex가 price이고 2001년도 이상인 ..
sort merge join 개요 테이블 조인의 경우 nested loop join, hash join, sort merge join 3가지가 있습니다. 이번 시간에는 sort merge join을 알아보겠습니다. sort merge join sort merge join은 내부적으로 정렬을 하고 조인을 하는 방식으로, not equal join에서 성능 향상을 위해 사용할 수 있는 방법입니다. non equal join이란 아래와 같이, where e.sal between s.losal and s.hisal 처럼 '='으로 이루어지지 않은 조인 형식을 말합니다. 아래와 같이, emp 테이블은 DEPTNO를 정렬해서 조인합니다. 따라서 dept 테이블은 emp테이블에 모든 행을 매번 접근하는 것이 아니라, 정렬에 따라서 종료된느 시점..
hash join 개요 오라클에서 조인의 방법은 총 3가지가 있습니다. nested loop join, hash join, merge join 중에서 hash join을 알아보겠습니다. hash join hash join은 선행 테이블을 해쉬 테이블로 설정하여 ROWID 대신, 해쉬값을 사용해서 대용량 데이터를 빠르게 처리하기 위한 방법입니다. nested loop join는 대용량 테이블을 조회할 때 적합하지 않습니다. for문 형식으로 계속 반복조회하기 때문입니다. nested loop join는 ROWID를 찾아서 다른 테이블과 조인했습니다. hash join은 선행 테이블을 해쉬 테이블이라 하며, 해쉬값을 저장하고 있으며, 오라클의 PGA에 저장됩니다. ROWID를 쓰지 않고 새로운 해쉬값을 할당받아 저장되므로, ..
인덱스 스캔 7가지 종류 개요 오라클에서 인덱스 스캔 방식이 많이 있는데 7가지를 정리해 보겠습니다. 오라클 옵티마이저가 자신이 판단할 때 최선의 선택을 하겠지만, 가끔 비효율적인 인덱스 스캔을 한다면, 7가지를 알아두고 적절한 인덱스 스캔을 적용하면 좋을 것 같습니다. 그 전에 먼저 인덱스가 적용되기 위한 WHERE 절 가공에 대한 사전 지식을 알아보겠습니다. WHERE절의 좌변을 가공하지 마라 숫자형 컬럼 인덱스 가공 SELECT ename, sal*12 FROM emp WHERE sal * 12 = 36000; -> SELECT ename, sal*12 FROM emp WHERE sal = 36000/12; 문자형 컬럼 인덱스 가공 SELECT ename, job FROM emp WHERE substr(job,1,5)='S..

728x90
반응형