Database 28

2개 이상의 다중 컬럼으로 기본키 지정하기

개발 업무를 하려면 필수적으로 ERD를 보게 되는데, 그냥 어렴풋이 넘겨짚었던 개념을 이제서야 정리한다. DB테이블의 Properties 또는 ERD를 보면 아래 예제처럼 2개 이상의 칼럼이 Primary Key로 지정된 테이블을 볼 수 있다.지금까지 대강 느낌적으로 잘 사용해서 다행이었지만, 하나의 테이블에 어떻게 기본키가 여러 개 존재할 수 있지?라는 의문을 마음 한구석에 쌓아 두고 있었다. 그래서 확인해본 결과 "테이블은 오직 하나의 기본키(PK)를 가질 수 있다"라는 것은 정확한 정의라는 것을 확인했다. 근데 여기서 포인트는 PK를 오직 하나의 컬럼으로만 설정할 수 있다는 것으로 잘못 해석하면 안 된다라는 점이다. 나는 이 부분을 잘못 이해하고 있었다. 다시 말해, 위 테이블에서 PK로 설정된 "..

Database 2021.04.07

인덱스 스캔(Index Scan)과 전체 테이블 스캔(Full Table Scan)

전체 테이블 스캔(Full Table Scan)1) 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식이다. 2) Oracle의 경우, 테이블의 고수위 마크(HWM, High Water Mark) 아래의 모든 블록을 읽는다.※고수위 마크(HWM): 테이블에 데이터가 쓰여졌던 블록 상의 최상위 위치(현재는 지워져서 데이터가 존재하지 않을 수도 있음)를 의미. 3) 위 그림과 같이 일반적으로 블록들은 서로 인접되어 있기 때문에, Full Table Scan는 한 번의 I/O에 여러 블록을 옮겨온다. 즉, 한 번의 I/O에 데이터를 다중 블록 단위로 메모리에 가져오기 때문에, Row 당 소요되는 입출력 비용이 인덱스 스캔에 비해 적다. 메모리에 옮겨진 ..

Database 2020.12.14

Oracle 인덱스(Index)와 B트리 인덱스(트리 기반 인덱스)

인덱스(Index) 정의 및 특징1) 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 ‘찾아보기’와 유사한 개념으로, 기본적인 목적은 검색 성능의 최적화이다. 즉, 조건을 만족하는 데이터를 인덱스를 통해 효과적으로 찾을 수 있도록 돕는다. 추가적으로 이 부분은 DBA분에게 물어보니 인덱스를 활용한 데이터 조회는 전체 데이터의 15% 이내의 데이터를 조회할 때가 인덱스 효율이 가장 좋으며, 그 이상의 건수에 대한 조회가 필요할 때부터는 효율이 떨어진다고 한다.2) 테이블에 인덱스를 생성하지 않아도 되고 여러 개를 생성해도 된다. → 선택적으로 생성할 수 있는 구조.3) DML 작업(Insert, Update, Delete 등)은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 ..

Database 2020.12.11

옵티마이저(Optimizer)와 실행계획(Execution Plan)

옵티마이저란? 1) 옵티마이저(Optimizer)는 SQL문의 요구사항을 처리하기 위한 최적의 실행 방법을 결정하는 역할을 한다.→ 여기서 최적의 실행방법이란 것은 한 마디로 '실행계획'이라고 할 수 있다.2) 옵티마이저는 두가지 방식(규칙기반, 비용기반)에 따라 구분된다.3) 현재 대부분의 관계형 데이터베이스는 비용기반 옵티마이저(Cost Based Optimizer)만을 제공한다. 비록 규칙기반 옵티마이저를 제공하더라도 신규 기능들에 대해서는 더 이상 지원하지 않는다. 다만 하위 버전 호환성을 위해서만 규칙기반 옵티마이저가 남아 있을 뿐이다. 하지만 규칙기반 옵티마이저의 규칙은 보편 타당성에 근거한 것들이기 때문에, 이러한 규칙을 알고 있는 것은 옵티마이저의 최적화 작업을 이해하는데 도움이 된다.  ..

Database 2020.11.19

오라클 NL Join, Sort Merge Join, Hash Join 특징 총정리

NL Join(Nested Loops Join) 수행 원리1) 다음은 NL Join의 수행 방식을 단계별로 나타낸 것입니다.① 선행 테이블에서 조건을 만족하는 첫 번째 행을 찾음 → 이때 선행 테이블에 주어진 조건을 만족하지 않는 경우 해당 데이터는 필터링 된다.② 선행 테이블의 조인 키를 가지고 후행 테이블에 조인 키가 존재하는지 찾으러 감 → 조인 시도③ 후행 테이블의 인덱스에 선행 테이블의 조인 키가 존재하는지 확인 → 선행 테이블의 조인 값이 후행 테이블에 존재하지 않으면 선행 테이블 데이터는 필터링 됨 (더 이상 조인 작업을 진행할 필요 없음)④ 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블을 액세스 → 후행 테이블에 주어진 조건까지 모두 만족하면 해당 행을 추출버퍼에 넣음. ⑤ ~ ⑪..

Database 2020.10.18

오라클 PL/SQL 트리거(Trigger)와 함수(User Defined Function) 특징 및 예제

사용자 정의 함수(User defined Function, Function) 특징프로시저(Procedure)처럼 SQL과 로직을 묶은 명령문이다. 다만 다른 점은 RETURN을 사용해서 하나의 값을 반드시 되돌려 줘야 한다는 특징이 있다. 보통 값을 계산하고 결과값을 반환하기 위해서 함수를 많이 사용한다. 즉, Function은 특정 작업 수행 후 반드시 결과값을 RETURN하는 PL/SQL 블럭(BLOCK). 생성방법은 프로시저와 동일하다. 단지 Procedure가 아니라 function으로만 바꿔주면 된다.CREATE [OR REPLACE] FUNCTION "함수 이름"(){ ... ...  트리거(Trigger) 특징1) 트리거(Trigger)란 특정 테이블에 DML이 수행되었을 때, 데이터베이스에..

Database 2020.09.29

오라클 PL/SQL 프로시저(Procedure) 특징 및 예제

프로시저(Procedure)의 특징 개발자가 자주 실행해야하는 특정 작업을 필요할 때 호출하기위해 절차적인 언어를 이용하여 작성한 이름이 있는 프로그램 모듈(Block)을 의미한다. - 매개 변수를 받을 수 있는 PL/SQL BLOCK 이다. (PL/SQL 블록이란?)- 프로시저 내의 변수는 Scalar변수라고 해서 임시 데이터 1개만 저장할 수 있는 변수이며, 모든 형태의 데이터 유형 지정 가능.- PL/SQL의 대입연산자는 ‘ := ’이다. (↔ T-SQL은 일반적인 ‘ = ’이다)- PL/SQL에서 사용하는 프로시저 내의 SELECT문장은 반드시 결과 값이 있어야 하며, 그 결과는 반드시 1개여야 한다. 조회결과가 없거나 2개 이상인 경우에는 에러가 발생(T-SQL은 결과값없어도 상관없음)한다. 그..

Database 2020.09.28

오라클 PL/SQL과 블록(Block) 구조 및 특징

Oracle 에서의 블록(Block) 구조 및프로시저(Procedure), 사용자 정의 함수(User Defined Function), 트리거(Trigger) 비교 총정리 PL/SQL(Oracle's Procedural Language extension to SQL, 절차형 SQL)이란??1) 응용 프로그램에서의 데이터베이스 처리 성능을 향상시키기 위해 SQL문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR) 등을 지원하며, 오라클 자체에 내장되어 있는(오라클에서 지원하는) Procedure Language이다. 2) PL/SQL을 이용하여 다양한 저장 모듈(Stored Module)을 개발할 수 있다.※저장 모듈: PL/SQL문장을 데이터베이스 서버에 저장하여 사용자와 애플리..

Database 2020.09.26

ORA-01950: 테이블스페이스 'USERS'에 대한 권한이 없습니다.

'USERS'테이블스페이스에 대한 권한이 없습니다.ORA-01950: no privileges on tablespace 'USERS'위 에러 또는 "ORA-30041: 테이블스페이스에 할당량을 부여할 수 없습니다." 등의 에러가 발생하면서 'Tablespace'란 용어가 등장했다. 테이블 스페이스(Table Space)란??Oracle에서는 사용자 생성 후 테이블을 생성하고 INSERT 하려는 순간 (혹은 CREATE시에) “ORA-01950: 테이블스페이스 ‘USERS’에 대한 권한이 없습니다.” 와 같은 오류가 발생할 수 있다. 왜냐하면 Oracle은 새로운 사용자를 생성한 직후에 기본적으로 할당받는 테이블 스페이스인 ‘USERS’라는 이름의 ROLE을 부여함. 근데 이 ‘USERS’ Tablespa..

Database 2020.09.25

Oracle 유저(USER)와 권한 및 롤(ROLE)

DCL(Data Control Language)과 유저(계정)DCL이란 한 마디로, 유저의 권한을 제어할 수 있는 명령어이다. 우리는 DB에 접속했다고 해서 바로 테이블, 뷰, 인덱스 등과 같은 오브젝트(Object)를 생성할 수 없다. 왜냐하면 Oracle에서의 사용자(유저, 계정)가 실행하는 모든 DDL(CREATE, ALTER, DROP, RENAME 등)문장은 그에 해당하는 권한이 있어야만 실행 가능하기 때문이다. 아래 표는 Oracle 설치 시 기본적으로 제공하는 유저이다.유저역할 SCOTTOracle 테스트용 샘플 유저, Default 패스워드: TIGERSYSDBA 역할을 부여받은 유저SYSTEMDB의 모든 시스템 권한을 부여받은 DBA유저. Oracle설치 시에 패스워드 설정.Oracle은..

Database 2020.09.24