[oracle] 오라클 데이터 모델링 - 데이터베이스 설계 고려 사항
오라클 데이터 모델링 - 데이터베이스 설계 고려 사항
데이터베이스 설계 고려 사항
Database Design Considerations
Performance를 고려한 Database Design 수정
- [데이터베이스 설계와 구축] 8장에서…
- 정규화를 통한 성능 향상
- 반정규화를 통한 성능 향상
- PK 순서 조정을 통한 성능 향상
- FK 인덱스 생성을 통한 성능 향상
- 이력모델의 구분과 기능성 컬럼을 통한 성능 향상
- 슈퍼타입/서브타입 구분을 통한 성능 향상
- 효율적인 채번 방법 사용을 통한 성능 향상
- 컬럼 수가 많은 테이블의 1:1 분리를 통한 성능 향상
- 대용량 테이블의 파티셔닝 적용을 통한 성능 향상
- CHAR 형식에서 개발 오류 제거를 통한 성능 향상
- 복잡한 데이터 모델 단순화를 통한 성능 향상
- 일관성있는 데이터타입과 길이를 통한 성능 향상
- 분산 환경 구성을 통한 성능 향상
Table과 Segment의 관계
table segment
- Heap-organized 1 1
- Partitioned 1 N -> http://me2.do/FwuEFNqU, http://me2.do/GcUzbjjr
- Clustered N 1 -> http://me2.do/5MfRssu5, http://me2.do/5oCnOOHZ, http://me2.do/5oCnQdjn(실습)
- Index-organized 1 2 -> http://me2.do/5ROboyz1, http://me2.do/xlJAs890(실습)
- MView -> http://me2.do/GkFy9CQD
-- CLUSTER 예제
set autot off
drop cluster bank_cluster including tables cascade constraints;
create cluster bank_cluster
(bank_number varchar2(30))
size 1k
tablespace users;
create index bank_cluster_idx
on cluster bank_cluster;
create table bank
(bank_number varchar2(30),
bank_name varchar2(30))
cluster bank_cluster(bank_number);
create index bank_pk_idx
on bank(bank_number);
alter table bank
add constraint bank_pk primary key(bank_number);
create table account
(account_number varchar2(30),
bank_number varchar2(30),
account_owner varchar2(30))
cluster bank_cluster(bank_number);
create index account_pk_idx
on account(account_number, bank_number);
alter table account
add constraint account_pk primary key(account_number, bank_number);
set autot on
select /*+ rule */ *
from account a, bank b
where a.bank_number = b.bank_number;
-----------------------------------------
| Id | Operation | Name |
-----------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | TABLE ACCESS FULL | BANK |
| 3 | TABLE ACCESS CLUSTER| ACCOUNT |
-----------------------------------------
-- IOT 예제
create table iot
(c1 number,
c2 number,
c3 number,
primary key(c1, c2))
organization index;
set autot on
select * from iot
where c1 > 0;
create index iot_c3_idx
on iot(c3);
select c3 from iot
where c3 > 0;
select * from iot
where c3 > 0;
--> http://www.orafaq.com/wiki/Index-organized_table
With Check Option
- View?
- Named Select!
- View에 대한 질의는 Base Table에 대한 질의로 transformation 됩니다. (예외 많음)
drop table t1 purge; create table t1 as select empno, ename, case when rownum < 10 then sal end as month_sal, case when rownum >= 10 then trunc(sal/4) end as week_sal, case when rownum < 10 then 'R' else 'IR' end as gubun, deptno from emp; create or replace view sawon_r as select empno, ename, month_sal, gubun, deptno from t1 where gubun = 'R'; create or replace view sawon_ir as select empno, ename, week_sal, gubun, deptno from t1 where gubun = 'IR'; select * from sawon_r; select * from sawon_ir; insert into sawon_r values (9999, 'JAMES', 400, 'IR', 20); select * from t1; --> 9999 사원은 IR인데 month_sal에 value가 입력되어 문제이다. delete from t1 where empno = 9999; ↓↓ create or replace view sawon_r as select empno, ename, month_sal, gubun, deptno from t1 where gubun = 'R' with check option constraint sawon_r_gubun_ck; create or replace view sawon_ir as select empno, ename, week_sal, gubun, deptno from t1 where gubun = 'IR' with check option constraint sawon_ir_gubun_ck; insert into sawon_r values (9999, 'JAMES', 400, 'IR', 20); --> 에러 : ORA-01402: view WITH CHECK OPTION where-clause violation insert into sawon_ir values (9999, 'JAMES', 400, 'IR', 20); --> 성공 select * from t1; --> 9999 사원이 제대로 입력되었음을 확인할 수 있다. select constraint_name, table_name, constraint_type from user_constraints where table_name like 'SAWON%' or table_name like 'TV%' or table_name like 'EMPL%' ;
참고 자료
- Partitioned Outer Join : http://me2.do/5Fc6guTF
select ... from days d LEFT OUTER JOIN sales s PARTITION BY (prod_id) ON (조인조건)
- Between 이해
drop table t1 purge; create table t1 (name varchar2(10), price number, start_date varchar2(8), end_date varchar2(8)); insert into t1 values ('ABC', 1000, '19980101', '20020331'); insert into t1 values ('ABC', 2000, '20020401', '20091210'); insert into t1 values ('ABC', 3000, '20091211', ''); insert into t1 values ('MOP', 2000, '20120101', '20131231'); insert into t1 values ('MOP', 2500, '20140101', ''); select * from t1; select * from t1 where '20120630' between start_date and nvl(end_date, '99991231');
Flashback Data Archive + Flashback Query
- 객체이름 정하기
http://orapybubu.blog.me/40045704831 http://me2.do/xV90URJ3 : Oracle SQL Reserved Words create table "2015 sales" (no number); drop table tab1 purge; create table tab1 (no number); create view tab1 as select no from tab1; -- 에러 create index tab1 on tab1(no); alter table tab1 add constraint tab1 primary key(no); create table substr (substr varchar2(30)); select substr, substr(substr, 1, 2) from substr;
MView http://docs.oracle.com/cd/E11882_01/server.112/e25554/toc.htm
- 물리모델링시 Width가 없는 Number형을 쓰지 말아야 할 이유
http://gseducation.blog.me/20095938837
References
개발자님들 덕분에 많이 배울 수 있었습니다. 감사의 말씀 드립니다.