[Oracle] 서브쿼리의 분류

2015. 10. 3. 23:01

간단히 다음과 같이 분류할 수 있다.

인라인뷰 : 메인쿼리의 FROM 절에 사용된 서브쿼리 (뷰처럼 사용된다고 해서 붙여진 이름)

서브쿼리 : (좁은 의미로) WHERE 절에 사용되는 서브쿼리, 폭 넓게는 서브쿼리 전체를 통칭 하는듯...

스칼라서브쿼리 : 서브쿼리 중에서도 특별히 SELECT 절에 컬럼처럼 사용된 서브쿼리를 말함.

* 틀린 부분있으면 지적해주시면 감사하겠습니다~!

곰돌곰둘 Oracle_DB_Unix admin/(3)뇌자극 오라클 PL/SQL

[Oracle] 연관성 있는 서브쿼리와 연관성 있는 서브쿼리

2015. 10. 3. 22:15

연관성있는 서브쿼리의 대표적인 예는 EXISTS 연산자를 사용하는 서브쿼리이다.


예제)

*연관성 없는 서브쿼리

select count(*) from employees

where department_id in (select department_id

from departments

where manager_id is not null);


--> EXISTS로 전환

*연관성 있는 서브쿼리

select count(*) from employees emp

where exists (select 1

from departments dep

where dep.manager_id is not null

and emp.department_id = dep.department_id);


--> 데이터의 연관성이 있다는 의미는 서브쿼리와 메인쿼리 사이에서 조인이 사용되었음을 의미한다.

* 연관성 있는 서브쿼리의 경우에는 조인을 수반하므로 반드시 별칭을 사용해야 한다.


(정의) 연관성 있는 서브쿼리: 메인쿼리에 독립적이지 않고 연관관계, 즉 조인을 통해 연결되어 있는 쿼리를 말한다.


<연관성 있는 서브쿼리의 활용>

예제)

* 일반 조인 사용 시

select emp.first_name||' '||emp.last_name emp_names,

emp.department_id,

dep.department_name

from employees emp, departments dep

where emp.department_id=dep.department_id;


* 연관성 있는 서브쿼리 사용 시

select emp.first_name||' '||emp.last_name emp_names,

emp.department_id,

(select dep.department_name

from departments dep

where dep.department_id = emp.department_id) dep_name

from employees emp;


연관성 있는 서브쿼리는 이와 같이 select list에 자주 쓰인다. 연관성 없는 서브 쿼리도 select list에 올 수는 있지만 실제로 그런 경우는 거의 없다.

왜 그럴까?

연관성 없는 서브쿼리의 경우 다중 로우를 추출하는 경우가 많음.

반면 연관성 있는 서브쿼리의 경우 메인쿼리와의 연관성(=조인)이 있기 때문에 SELECT LIST에 올 수 있으며, 이러한 경우 단일 로우를 추출하게 된다.


* 뇌를 자극하는 오라클 프로그래밍 (홍형경 저) 참조함.

'Oracle_DB_Unix admin > (3)뇌자극 오라클 PL/SQL' 카테고리의 다른 글

PL/SQL 문장과 커서  (0) 2015.10.08
PL/SQL 객체  (0) 2015.10.04
[Oracle] 인라인뷰  (0) 2015.10.03
[Oracle] 서브쿼리의 분류  (0) 2015.10.03
[Oracle] EXISTS 연산자의 활용  (0) 2015.10.03

곰돌곰둘 Oracle_DB_Unix admin/(3)뇌자극 오라클 PL/SQL

[Oracle] EXISTS 연산자의 활용

2015. 10. 3. 21:23

문제: 부서 번호가 30, 60, 90인 직원 출력하기

(1) IN 연산자 활용시 
select department_id, employee_id from employees

where  department_id in (30,60,90)

order by 1, 2;


(2) EXISTS 연산자 활용 시

select emp.department_id, emp.employee_id

from employees emp

where exists

(select dep.department_id

from departments dep

where dep.department_id in (30, 60, 90)

and emp.department_id=dep.department_id)

order by 1, 2;


--> 변환(동일한 결과값 출력됨)


(3) EXISTS 연산자 활용 시

select emp.department_id, emp.employee_id

from employees emp

where exists

(select 1

from departments dep

where dep.department_id in (30, 60, 90)

and emp.department_id=dep.department_id)

order by 1, 2;


<EXISTS의 특징>

(1)EXISTS는 오직 서브쿼리만 쓸 수 있다.

(2)서브쿼리에서 조인을 사용한다.

(3)EXISTS는 서브쿼리의 결과가 있느냐 없느냐만 체크한다.

(IN 이 WHERE 조건절에 해당하는 레코드의 컬럼값을 출력하는 것과는 대비하여-)

  *EXISTS는 존재하느냐 존재하지 않느냐의 여부만 체크하기 때문에 서브쿼리의 SELECT 리스트에는 등장하는 값과는 상관없이 서브쿼리의 결과로 반환되는 로우가 있느냐 없느냐만 중요한 것이다.


<NOT IN과 NOT EXISTS>

IN과 EXISTS는 동일한 결과값을 출력한다.

반면 NOT IN과 NOT EXISTS는 결과값이 다를 수 있다. 바로 NOT IN 은 NULL 값을 포함하지 않기 때문이다.


예제)

department_id 가 null인 레코드 1건 존재-->

select employee_id, department_id

from employees

where department_id is null;

1개 recored


NOT IN -->

select department_id, employee_id from employees

where  department_id not in (30,60,90)

order by 1, 2;

92개 records


NOT EXISTS -->

select emp.department_id, emp.employee_id

from employees emp

where not exists

(select 1

from departments dep

where dep.department_id in (30, 60, 90)

and emp.department_id=dep.department_id)

order by 1, 2;

93개 records


※차이가 발생하는 이유

IN은 OR이다.

department_id IN (30, 60, 90) --> department_id = 30 or department_id = 60 or department_id = 90 으로 바꿔 쓸 수 있다.

NOT IN의 경우 (AUB)^C 이므로 A^C교집합B^C으로 쓸 수 있다.

department_id NOT IN (30, 60, 90) --> (a)department_id <> 30 and (b)department_id <> 60 and (c)department_id <> 90 으로 바꿔 쓸 수 있다.

문제는 null 값은 '=', '<>' 연산을 했을때 TRUE/FALSE를 반환하지 않고 UNKNOWN을 반환한다는 것에 있다. 따라서 department_id가 null인 178번 사원은 (a), (b), (c) 어디에도 포함되지 않고, 따라서 반환되지 않는다.


반면 EXISTS의 경우 해당 로우의 존재여부만 체크하기 때문에, NOT EXISTS는 department_id 값이 30, 60, 90이 아닌 모든 로우를 조회하게 되며, 따라서 department_id가 null인 값도 출력에 포함되는 것이다.


<IN과 EXISTS의 활용>

컬럼값에 대해 비교할 값이 문자나 숫자 등의 상수 리스트를 사용할 경우 IN을 사용하도록 하고, 만약 서브쿼리를 사용한다면 IN보다는 EXISTS를 사용하는 것이 훨씬 성능이 좋다.


* 뇌를 자극하는 오라클 프로그래밍 (홍형경 저) 참조함.

곰돌곰둘 Oracle_DB_Unix admin/(3)뇌자극 오라클 PL/SQL

1장 7절: Consistent vs. Current 모드 읽기

2015. 9. 15. 23:01

*참고 1: 언두 세그먼트 확인 쿼리

select s.sid, s.serial#, t.xidusn, t.used_ublk, t.used_urec

from v$session s, v$transaction t

where t.addr = s.taddr

--and s.sid = 144;


*참고 2: SCN 확인 쿼리

select current_scn, scn_to_timestamp(current_scn)

from v$database;


----------------------------------

61~ 70 p 읽기 일관성 실습내용

*기본 제공 HR스키마에서 연습


- 확인 쿼리

select employee_id, salary

from employees

where employee_id = 100;


- 복원 쿼리

update employees set salary = 1000

where employee_id = 100;

commit;


(상황1)


<TX1>

update employees set salary = salary + 100

where employee_id = 100;


commit; --> 1 rows updated


<TX2>

update employees set salary = salary + 200

where employee_id = 100;


commit; --> 1 rows updated


예측 : salary = 1300

확인 : salary = 1300 --> 검증 성공


(상황2)


<TX1>

update employees set salary = 2000

where employee_id = 100

and salary = 1000;


commit; --> 1 rows updated


<TX2>

update employees set salary = 3000

where employee_id = 100

and salary = 2000;


commit; --> 0 rows updated


예측 : salary = 2000

확인 : salary = 2000 --> 검증 성공



(상황3)

--> 일단 사고 실험

예측 : 50,000건 갱신

이유 : Consistent 모드로 갱신대상을 식별하는데, update 문 실행 시점(t1)이 insert 문 실행 시점(t2)보다 앞서므로 t3시점에서 TX2가 commit 되더라도 식별 대상 자체에서 제외되므로 아예k가 업데이트 되지 않는다..


--> 숫자를 10000 --> 10으로 줄여 실험해보자.


- 확인 쿼리

select * from t1;


conn user01/oracle

create table t1 (a varchar(2), no number);

insert into t1 (a,no) values ('a',1);

insert into t1 (a,no) values ('b',2);

insert into t1 (a,no) values ('c',3);

insert into t1 (a,no) values ('d',4);

insert into t1 (a,no) values ('e',5);

insert into t1 (a,no) values ('f',6);

insert into t1 (a,no) values ('g',7);

insert into t1 (a,no) values ('h',8);

insert into t1 (a,no) values ('i',9);

insert into t1 (a,no) values ('j',10);

commit;


<TX1>

update t1 set no = no +1

where no > 5;


commit; --> 5 rows updated


<TX2>

insert into t1 (a,no) values ('k',11);

commit; --> 1 rows created


예측 결과 집합

(a,1) (b,2) (c,3) (d,4) (e,5) (f,7)

(g,8) (h,9) (i,10) (j,11) (k,11) --> 검증 성공!



(상황4)


<TX1>

update employees set salary = salary + 100

where employee_id = 100

and salary = 1000;


commit; --> 1 rows updated


<TX2>

update employees set salary = salary + 200

where employee_id = 100

and salary = 1000;


commit; --> 0 rows updated


예측 : salary = 1100

확인 : salary = 1100 --> 검증 성공


--> 설명

상황 1, 2, 4

오라클에서는 update(및 delete, merge)를 수행할 때,

단계(1) Consistent Mode로 Update 대상을 식별한 후

단계(2) Current Mode로 실제 Update를 수행하나, 그냥 수행하는게 아니라

Current Mode로 다시 한번 where 조건을 체크한 후 부합하는 레코드만 Update를 수행한다.


상황1: 두 번 체크할 때 모두 부합하므로 TX2가 성공하였다.

상황2: 애초에 1단계에서 Consistent Mode로 체크할 때 where절 조건이 일치하지 않으므로 실패한다.

상황4: 1단계는 성공하였으나, 2단계에서 Current Mode로 체크할 때 where절 조건이 일치하지 않으므로 실패한다.


★ 상황 2와 상황 4의 중요한 차이점은, 상황 2에서는 1단계에서 바로 실패하므로 TX1의 Exclusive Lock이 해제 될 때까지 대기할 필요 없이 바로 실패 메시지(0 rows updated)를 띄우지만, 상황4에서는 2단계(t3시점의 TX1 commit시점)에서 Current Mode로 재검증 시 실패할 때야 비로소 실패 메시지를 띄운다는 것이다. 실험을 통해서 직접 확인 할 수 있다.


검증해보자!

곰돌곰둘 Oracle_DB_Unix admin/(2)오라클 성능 고도화 1권

LGWR의 활동주기

2015. 8. 16. 22:55

LGWR 백그라운드 프로세스가 수행되는 경우

1. 커밋을 수행할 경우 발생

2. DBWR 백그라운드 프로세스가 데이터 버퍼 캐쉬의 변경된 데이터 블록을 데이터 파일에 적용하기 전에 발생

3. 리두 로그 버퍼의 1/3 이상이 사용되었을 경우 발생

4. 1MB 이상의 리두 로그가 생성되었을 경우 발생

5. 3초마다 발생

곰돌곰둘 Oracle_DB_Unix admin/미분류

DBWR의 활동주기

2015. 8. 16. 22:41

DBWR의 활동주기


1) 체크포인트가 발생했을 경우

2) 더티 버퍼의 수가 임계치에 도달했을 경우

3) 프리 버퍼가 필요하여 데이터 버퍼 캐쉬에서 일정한 수의 버퍼를 검색하고도 프리 버퍼를 찾지 못했을 경우

4) 테이블스페이스가 오프라인 또는 읽기 전용 (Read Only) 모드로 변경될 경우

5) 테이블이 DROP되거나 TRUNCATE될 경우

6) 테이블스페이스에 온라인 백업 명령이 수행될 경우

7) 주기적인 타임아웃에 의해 발생

곰돌곰둘 Oracle_DB_Unix admin/미분류

Oracle DBMS설치

2015. 5. 23. 14:59

아이티윌 5.23

0.실습환경 준비

1. VMware 설정

버추얼 네트워크 에디터
실습을 위한 VMware 설정

2. 배경 지식 학습


a. 유저 oracle: 그룹 oinstall, dba에 속하게 한다.

- oinstall: 오라클 설치 그룹
- dba: 오라클 관리 그룹

b. 환경 변수 설정

ORACLE_BASE: 오라클 회사에서 나온 제품들 (Oracle DBMS, Grid Infrastructure 등)을 설치할 기본 경로
ORACLE_HOME: 오라클 DBMS 제품을 설치하기 위한 경로
ORACLE_SID: 인스턴스 명 (7글자 이하, 영문으로)

기본세팅예제
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db
ORACLE_SID=orcl

- NLS_LANG: 언어, 지역 및 클라이언트 Character Set 설정 제어

예제: NLS_LANG=euc_kr.UTF8

UTF8: 캐릭터셋(문자셋) --> 다른 서버와 통신할때 오가는 문자열이 해당 법칙을 따르겠다는 의미
한글만 쓸때: KSC5601, MSWIN949 등
대부분의 경우: UTF8을 쓰면 된다. (다국어 처리 가능) 한자, 일본어, 아랍어 등 모두 처리 가능 : 3byte, 4byte까지 모두 지원가능함.
영문: USC671: 영어, 숫자밖에 처리가 안됨(2Byte제한)

euc_kr: 날짜 등을 표현하는 문화적 양식을 정함. --> 생략가능한 부분 : 생략 시 'C'를 사용함. 컴퓨터가 알아들을 수 있는 언어 (영문)으로 처리하게 됨.
한국 : 2015/05/23
미국: 05/23/2015 

- 환경 변수 확인 방법 echo
실습환경 :
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
ORACLE_BASE=/u01/app/oracle
NLS_LANG=KOREAN_KOREA.UTF8

3. Oracle Grid Infrastructure 설치 (One-Node RAC)

- asm내용
export ORACLE_SID=+ASM
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/grid

- db내용
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

cat ~/.bash_oracle

4. FRA 디스크 그룹 설정

Fast Recovery Area (FRA)
*참고
DATA 디스크 그룹: 실질적인 데이터 파일 저장
RECO 디스크 그룹: 리두 로그 파일 저장
FRA 디스크 그룹: 빠른 복구를 원할 때 해당 기능을 사용하기 위해서 만듦.

5. 오라클 데이터베이스 소프트웨어 설치

6. DBCA로 데이터베이스 구성하기


'Oracle_DB_Unix admin' 카테고리의 다른 글

(극미세팁)SQL Server int 변환시 overflow 발생  (1) 2019.09.17

곰돌곰둘 Oracle_DB_Unix admin

1. E-R 모델링 개요

2015. 5. 10. 11:06

#모델링 개요

1)컨셉 모델링

2)논리 모델링

3)물리 모델링

* E-RD (E-R)다이어그램


엔티티 관계 모델


- 본질식별자 = 주민등록번호

--> 가상식별자(인조식별자) = 사원번호


- Primary Key(기본키) = 한 entity에서 prmary key는 1개임 

  #으로 표기

- Candidate key (후보키):

   후보키 중에서 Primary key를 선택하게 됨.

   사원 테이블에서 사원번호, 전화번호, 주민등록번호 등이 후보키가 될 수 있음.

   Unique + Not Null 조건을 만족해야 함.

  *로 표기

  

  - Foreign Key(외래키)

    정의: Foreign key는 동일한 테이블이나 다른 테이블의 Primary key를 참조하는 열(또는열집합)

  

  PK > 후보키 > UID

  *UID는 not null 조건을 만족하지 않아도 가능.

  

  

 E-R모델링 규칙

* 관계의 표현

기호  설명 

점선  "maybe"를 나타내는 선택적 요소 

실선  "must be"를 나타내는 필수 요소 

까치발  "one or more"를 나타내는 정도 요소 

일방선  "one and only one"을 나타내는 정도 요소 

곰돌곰둘 카테고리 없음

Chapter 4 오라클 프로세스

2015. 4. 8. 23:32

Chapter 4 오라클 프로세스

<연습문제>
1. 오라클의 필수 백그라운드 프로세스란 무엇이며 5가지의 필수 백그라운드 프로세스를 기술하시오.

오라클이 DB를 작동시키기 위해 필요한 프로세스.
DBWR(Database Writer) : 데이터 버퍼 캐쉬 -> 데이터 파일
LGWR(Log Writer) : 로그 버퍼 캐쉬 -> 리두 로그 파일
PMON(Process Monitor) : PGA 다운 시 자원 회수
SMON(System Monitor) : SGA 다운 시 DB 재시작 및 데이터 무결성 보장
CHKT(Check Point) : CKPT: 데이터 버퍼 캐쉬의 변경된 데이터 블록을 데이터 파일에 기록하여 메모리 내의 데이터와 데이터 파일에 저장된 데이터를 일치시키는 일련의 작업(DB의 정합성 유지목적에서 수행)

2. DBWR, LGWR 백그라운드 프로세스의 지연 쓰기와 빠른 커밋에 대해 기술하시오.

DBWR - 지연쓰기 : 매 트랜잭션 및 커밋에 대해 즉각 데이터 파일에 반영하게 될 경우 DISK I/O가 과도하게 발생하여 DB성능이 저하될 수 있으므로, 지연쓰기 기능을 활용한다. 실제 데이터 파일에 트랜잭션을 반영하는 것은 일정 조건을 만족할 때 진행하며, Oracle DBMS의 경우 데이터 블록 단위로 I/O를 하는데, 이것은 동일 데이터 블록에 있는 데이터들의 변경을 한번에 기록할 수 있게 해서 DISK I/O를 줄이는데 도움을 준다.
한편, 그럼에도 불구하고 트랜잭션 커밋 시 다른 유저가 변경된 내용을 읽을 수 있어야 하므로, 변경 내용을 데이터 버퍼 캐쉬에 기록해서 메모리에서 요청을 처리할 수 있도록 한다. 하지만 메모리에만 기록을 했을 시 프로세스 재 가동 등에 의해 변경내용이 사라질 수 있으므로, 이 내용을 리두 로그 파일에 기록한다. 로그 버퍼 캐쉬에 변경된 내용이 저장되었다가 커밋 발생 시 이전까지 발생했던 트랜잭션을 모아서 LGWR프로세스가 리두 로그 파일에 저장하게 되는데, 이것을 빠른 커밋이라고 한다.

3. LGWR 백그라운드 프로세스의 동시 쓰기에 대해 기술하시오.

로그 버퍼 캐쉬에 저장된 트랜잭션들을 한꺼번에 리두 로그 파일에 옮겨 쓰는 것을 말한다. 특정 조건이 만족될 시 LGWR 프로세스는 메모리의 변경 내역을 디스크(리두 로그 파일)에 저장한다.

4. SMON 백그라운드 프로세스의 4가지 역할을 기술하시오.

- 인스턴스 복구 시행 : 데이터베이스의 비정상 종료시 메모리에 저장되었던 커밋 트랜잭션을 복구. 리두 로그 파일 활용

- 데이터 블록의 연속된 공간 통합 : 데이터 파일의 구분선 위치를 변경함으로써 효율적으로 스토리지 공간을 활용할 수 있게 해줌. 데이터 블록의 크기가 동일 할 경우 수행할 필요가 없다. 관련 파라미터를 조작함으로써 수행 주기를 조정할 수 있다. 

- 임시 세그먼트 제거 : DB 종료시 사용했던 임시 세그먼트를 제거한다.

- OPTIMAL 크기 유지 : 롤백 세그먼트의 크기를 최적으로 유지하기 위해 12시간에 한번씩 롤백 세그먼트를 축소하는 작업을 진행한다.

5. CKPT 백그라운드 프로세스가 본연의 작업을 수행하게 되는 경우를 기술하시오.

- 로그 스위치 (리두 로그 파일 교체) 발생 시
- 3초마다 발생
- 테이블스페이스가 오프라인으로 변경시
- 데이터베이스가 정상 종료 될 시
- 수동 조작 : ALTER SYSTEM CHECKPOINT 명령 수행
- 자동 실행 : FAST_START_MTTR_TARGET 파라미터에서 설정됨.

6. 공유 서버 환경에서 사용되는 2개의 백그라운드 프로세스를 기술하시오.

공유 서버 환경 (MTS): 하나의 서버 프로세스를 여러 개의 유저 프로세스가 공유하여 사용하는 방식 (1:N)
Snnn과 Dnnn

7. 온라인 백업을 수행하기 위해서 필요한 백그라운드 프로세스를 기술하시오.

??? ARCH???

8. 병렬 프로세싱을 수행하면 기동하는 백그라운드 프로세스를 기술하시오.

Pnnn (Parallel Query Slaves)

9. 오라클 10g의 새로운 백그라운드 프로세스인 MMAN 백그라운드 프로세스와 PVWR 백그라운드 프로세스의 역할을 기술하시오.

MMAN(Memory Manager) : 메모리에서 실행되는 SQL문 등을 저장하여 AWR에 보내는 프로세스 (자가 진단 기능)--> MMON(Memory Monitor)에 대한 설명이며, MMAN은 공유 메모리에 대한 동적 관리 프로세스이다.

PVWR(플래시백) : 10g의 새로운 복구 기능인 플래시백을 사용 가능.

곰돌곰둘 Oracle_DB_Unix admin/(1)초보자를 위한 Oracle 10g

초보자를 위한 10g - 공부계획

2015. 4. 5. 20:35

Chapter 3 - 오라클 메모리 (40p) -- 4/5(일) -- 4/7(화) 완료
Chapter 4 - 오라클 프로세스 (32p) -- 4/6(월) -- 4/8(수) 완료
Chapter 5 - 오라클 엑세스와 시스템 뷰 (24p) -- 4/7(화) -- 4/9(목) 완료
Chapter 6 - 오라클 필수 파일 (34p) -- 4/8(수) -- 4/10(금) 완료

Chapter 7 - 오라클 시작과 종료 (16p) -- 4/9(목)
Chapter 8 - 리두 로그 파일과 아카이브 로그 파일 (40p) -- 4/9(목)~ 4/10(금)
Chapter 9 - 오라클 스토리지 (50p) -- 4/11(토)
Chapter 10 - 테이블스페이스 (42p) -- 4/12(일)
    Chapter 11 - 오라클 오브젝트 (56p) -- 4/12(일)
Chapter 12 - 언두 데이터 (22p) -- 4/13(월)
    Chapter 13 - 제약 조건 (20p) -- 4/14(화)
    Chapter 14 - 유저와 권한 (20p) -- 4/14(화)
Chapter 15 - 플래쉬백과 데이터 펌프 (36p) -- 4/15(수)
--------------------------------------
총 432p 분량

곰돌곰둘 카테고리 없음