Tablespace 삭제

프로그래밍/DB 2007. 11. 27. 14:28 Posted by galad
Tablespace 삭제
Tablespace가 더이상 필요없는 경우 Tablespace와 내용을 삭제
Oracle7에서는 System Tablespace을 제외한 모든 Tablespace 삭제 가능
DROP TABLESPACE 권한 필요

Tablespace 삭제시 주의사항

1. Tablespace를 삭제하면 데이타 복구가 불가능하므로 삭제할 Tablespace에
있는 데이타가 나중에 필요 없는지 여부를 판단한 후 삭제
2. Tablespace 삭제 전과 후 데이타베이스 Full Backup 필요 ==> 나중에 문제 발생시 복구가 가능하도록 하기위해

Tablespace를 Oracle에서 삭제한 후 OS명령어(Del, rm)로 삭제된 Tablespace의 데이타파일을 삭제해야 함
사용중인 세그먼트가 들어 있는 Tablespace 삭제 불가(Tablespace의 테이블 현재 사용중인 경우,
Tablespace에 사용중인 Rollback Segment가 포함된 경우) ==> Tablespace를 Offline 상태로 변경 한 후에만 삭제 가능
Tablespace 삭제한 후 Tablespace 에대한 정보는 데이타딕셔너리에 남아 있으나 Tablespace 상태가 INVALID

예] sp_test Tablespace 삭제

 SQL>DROP TABLESPACE sp_test INCLUDE CONTENTS 
옵션] INCLUDE CONTENTS : Tablespace내에 데이타가 존재하는 경우
CASCADE CONSTRAINTS : Primary Key, Forein Key 등의 Constraint 조건을 연속으로 삭제하는 경우

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 인덱스 생성 [CREATE INDEX]  (0) 2007.11.27
Tablespace 정보보기  (0) 2007.11.27
Making a Tablespace Read Only  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27

Making a Tablespace Read Only

프로그래밍/DB 2007. 11. 27. 14:28 Posted by galad
Making a Tablespace Read Only
필요 조건
읽기 전용 테이블스페이스를 쓸 수 있도록 만들기
WORM장치에서 일기 전용 테이블스페이스 생성

Tablespace내의 데이타파일에 쓰기 방지
· 방법 : ALTER TABLESPACE 명령 사용
· 권한 : ALTER TABLESPACE 권한
· 예] sp_test라는 Tablespace를 Read Only으로

     SQL>ALTER TABLESPACE sp_test READ ONLY;
· Read Only는 Tablespace Online, Offline 상태가 아님

필요조건
Tablespace이 Online 상태
· Offline 상태에서 Tablespace을 읽기 전용으로 변경시
· 에러 발생 ORA-01539: tablespace 'SP_TEST' is not online
전체 데이타베이스내에 실행중인 트랜잭션이 없어야 함
Tablespace에 사용중인 Rollback Segment가 없어야 함
Tablespace은 현재 Online Backup을 수행하지 않음
· (백업시 Tablespace내의 데이타파일의 Header File 변경)
7.1.0 이상

Read Only Tablespace에 속하는 데이타파일의 이름, 크기 변경 불가

Read Only 해제
Tablespace에 READ/WRITE 가 가능 하도록
방법 : ALTER TABLESPACE 명령 사용
권한 : ALTER TABLESPACE 권한
예] sp_test라는 Tablespace을 Read Only에서 해제
 SQL>ALTER ATBLESPACE sp_test READ WRITE;
필요조건
· Tablespace 내의 모든 데이타파일이 온라인 상태
· (V$datafile View에서 Datafile 상태 확인 후 ALTER DATABASE DATAFILE ONLINE으로)

WORM 장치에서 Read Only 테이블 생성
갱신이 필요없는 Read Only 파일이 있어면 WORM(Write Once Read Many)장치에서 Read Only Tablespace 생성
WORM장치에서 Read Only Tablespace을 생성하는 절차
    1. 다른장치에서 쓸수 있는 Tablespace 생성한 후 Tablespace에 속한 개체를 생성하여 데이타에 넣음
    2. ALTER TABLESPACE 명령의 READ ONLY 옵션으로 Read Only으로 Tablespace 변경
    3. Tablespace의 데이타파일을 WORM 장치에 복사한 후 Copy명령어로 파일을 복사
    4. Tablespace을 Offline으로
    5. WORM 장치에 복사한 데이타파일이름과 일치하도록 데이타파일 이름 변경
    ==> Control File 이름 변경
    6. Tablespace을 Online

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 정보보기  (0) 2007.11.27
Tablespace 삭제  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27

Altering Tablespace Availability

프로그래밍/DB 2007. 11. 27. 14:27 Posted by galad
Altering Tablespace Availability
Tablespace을 Online과 Offline 상태를 이용하여 사용자가 일시적으로 테이블 사용 가능 여부를 변경
Tablespace를 Online으로 설정
Tablespace를 Offline으로 설정

Tablespace을 Online으로 설정
데이타베이스가 Open된 상태에서 설정 가능
명령어 : ALTER TABLESPACE
권한 : ALTER TABLESPACE 권한
SYSTEM Tablespace은 항상 Online 상태
예] sp_test Tablespace를 Online으로
   SQL> ALTER TABLESPACE  sp_test ONLINE;

Tablespace을 Offline으로 설정
Offline 설정할 수 있는 경우
o. 데이타베이스의 일부분의 Tablespace를 사용할 수 없게하고, 나머지 Tablespace를 정상적인 접근이 가능하도록 할 경우
o. Offline Tablespace 백업할 경우
o. 응용프로그램 갱싱시 응용프로그램과 연관된 테이블 그룹을 일시적으로 Offline하는 경우
데이타베이스가 Open된 상태에서 설정 가능
명령어 : ALTER TABLESPACE
권한 : ALTER TABLESPACE 권한

Tablespace Offline의 3가지 선택사항

NORMAL :
· Offline 수행시 Tablespace 내의 모든 데이타파일에 대해 Check Point 수행
· Tablespace 내의 모든 데이타 파일이 Online 상태인 경우
· (Tablespace 내의 모든 데이타파일에 오류가 없는 경우에 사용)
· Online으로 복귀시 Media Recovery가 필요 없음
· Noarchivelog Mode에서 사용

TEMPORARY :
· Offline 수행시 Tablespace 내의 데이타파일중 Online 상태인 데이타파일에 대해 Check Point 수행
· Tablespace에 하나이상의 데이타파일에 오류가 있을 경우 사용
· Online으로 복귀시 정상적으로 Offline 설정인 안된 경우에만 Media Recovery가 필요

IMMEDIATE :
· Offline 수행시 데이타파일에 대해 check Point를 수행 않음
· Online으로 복귀시 반드시 Media Recovery 수행하여야 함
· Noarchivelog Mode인 경우 설정 불가

Tablespace을 Offline 설정시 Normal(default) 사용 하는 것이 좋음
(Tablespace를 다시 Online으로 변경시 Recovery 가 필요 없기 때문)

예] sp_testTablespace을 정상적으로 Offline

       SQL>ALTER TABLESPACE sp_test OFFLINE NORMAL
[참조] Online Tablespace를 Offline으로 변경시 현재 사용중인 Rollback segment가 포함되어 있는지 확인

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 삭제  (0) 2007.11.27
Making a Tablespace Read Only  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27

Tablespace 관리에 대한 지침사항

프로그래밍/DB 2007. 11. 27. 14:27 Posted by galad
Tablespace 관리에 대한 지침사항
다중 테이블스페이스 사용
테이블스페이스 저장 영역 매개변수 지정
사용자에게 테이블 스페이스 할당량 지정

Multiple Tablespace 사용
데이타베이스 작업을 보다 융통성 있게 해줌
데이타베이스가 Multiple Tablespace를 사용하여 다음과 같은 작업 가능
· 데이타 딕셔너리 데이타로부터 사용자 데이타 분리
· 한 응용프로그램의 데이타를 다른 응용프로그램의 데이타로부터 분리
· I/O 경합을 줄이기 위해 서로 다른 Tablespace의 데이타 파일을 별도의 디스크 드라이브에 저장
· 사용자 데이타로부터 Rollback Segment 데이타를 분리하여 단일 디스크 고장에 의한 영구적인 데이타 손실 방지
· 개별 Tablespace은 Offline으로 다른 사항은 Online온라인으로 설정
· 고도의 갱신작업, 읽기 전용 작업, 임시 세그먼트 저장과 같은 특정 유형의 데이타베이스 사용을 위해 Tablespace 예약
· 개별 Tablespace 백업

Tablespace 저장 영역 매개변수 지정
새 Tablespace 생성시 Tablespace저장 영역, 여러가지 매개변수를 지정 가능
지정하지 않으면 기본 저장 영역 매개변수를 사용

사용자에게 Tablespace 할당량 지정
사용자에게 Tablespace에 대한 저장공간할당을 가능
CREATE USER, ALTER USER 명령에서 QUOTA 절

· CREATE USER절

        SQL> CREATE USER hcpark IDENTIFIED BY hcpark
                    DEFAULT TABLESPACE user_data
                    QUOTA 10M ON temp
                    QUOTA  5M ON user_data;

· ALTER USER절

       SQL> ALTER USER hcpark 
                  QUOTA 20M ON user_data;

'프로그래밍 > DB' 카테고리의 다른 글

Making a Tablespace Read Only  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27
[펌] 오라클 TableSpace 및 사용자 생성  (0) 2007.11.27

Tablespace 할당 관리

프로그래밍/DB 2007. 11. 27. 14:26 Posted by galad
Tablespace 할당 관리
Tablespace의 저장 영역 설정 변경
빈영역 병합

Tablespace의 저장영역 설정 변경
데이타베이스 작업을 보다 융통성 있게 해줌
테이블 생성시 설정한 매개변수를 변경하지 않고 Tablespace에 앞으로 생성할 개체의 기본사양 변경 가능
명령 : ALTER TABLEAPCE 변경
권한 : ALTER TABLEAPCE 권한 필요
예] sp_test1의 기본 저장 영역을 변경
  변경전
     SQL> CREATE TABLESPACE sp_test
          DATAFILE '/oracle_data/sp_test1.dbf' SIZE 5M
          DEFAULT STORAGE(
                   INITIAL 50K
                   NEXT 50K
                   MINEXTENTS 2
                   MAXEXTENTS 50
                PCTINCREASE 0) OFFLINE;
  변경후
     SQL> ALTER TABLESPACE sp_test
          DEFAULT STORAGE(
                   INITIAL 50K
                   NEXT 50K
                   MINEXTENTS 2
                   MAXEXTENTS 50
                PCTINCREASE 50);

빈 영역의 병합
Tablespace Segment 영역은 Extent(Block의 모임)에 의해 관리
Tablespace Segment 영역에 새로운 Extent를 할당하는 경우 가장 크기가 유사한 영역을 사용하므로,
큰 빈 영역은 작은 영역으로 나누어지고, 작은 빈 영역은 큰영역으로 병합되어짐
SMON(시스템 모니터) 프로세스가 Tablespace의 작은 빈 Extent를 병합
영역의 단편화가 심한 경우(연속적인 영역이 디스크 상에서 비연속적으로 저장) 빈영역을 단일 영역 트랜잭션으로 병합가능
· 8번째 병합을 하면 영역 트랜잭션을 Commit되고, 다른 트랜잭션은 영역을 할당하거나 해체함
Tablespace 병합시 ALTER TABLESPACE 권한 필요
예] Tablespace 단위로 모든 사용가능한 빈 Extent 영역을 큰 Extent 영역으로 병합
 SQL> ALTER TABLESPACE sp_test COALESCE;

Tablespace 정보보기
Tablespace 병합가능한 Extent영역에 대한 정보는 DBA_FREE_SPACE_COALESCED 뷰를 사용

 SQL> SELECT * FROM DBA_FREE_SPACE_COALESCED;

 
 TABLESPACE_NAME  TOTAL_EXTENTS EXTENTS_COALESCED PERCENT_EXTENTS_COALESCED TOTAL_BYTES
 BYTES_COALESCED  TOTAL_BLOCKS  BLOCKS_COALESCED  PERCENT_BLOCKS_COALESCED   

 SYSTEM                  8                  8                  100              1521664
 1521664                743                743                 100
 
 USER_DATA               1                  1                  100              1859584
 1859584                908                908                 100
 
 ROLLBACK_DATA           1                  1                  100              3090432
 3090432               1509               1509                 100
 
 TEMPORARY_DATA          1                  1                  100              2095104
 2095104               1023               1023                 100
 
 SP_TEST                 1                  1                  100              5240832
 5240832               2559               2559                 100

Tablespace 생성

프로그래밍/DB 2007. 11. 27. 14:26 Posted by galad
Tablespace 생성
Tablespace 생성
Temporary Tablespace 생성

Tablespace 생성
ORACLE 저장영역관리 작업을 피하고자 할때 사용
운영체제마다 테이블 생성단계 다름
SYSTEM Tablespace : 데이타베이스의 첫번째 Tablespace로 데이타베이스 생성시 자동으로 생성
새로운 Tablespace을 생성하는 경우
· 데이타베이스 확장할때(관련된 데이타베이스에 더 많은 디스크 저장 영역을 할당)
· 저장된 다른 데이타와는 별도로 특정유형의 데이타를 새로운 논리적 저장구조에 저장할때
데이타베이스 전체 크기를 늘리는 방법
· 새로운 Tablespace를 생성하는 대신 기존 Tablespace에 데이타 파일을 추가

Instance는 Tablespace에 데이타를 넣을려면 최소한 두개의 Rollback Segment필요(System Rollback Segment를 포함)

새로운 Tablespace 생성에 필요한 권한과 명령
· 사용자가 CREATE TABLESPACE 권한
· CREATE TABLESPACE 명령

예] sp_test라는 Tablespace 생성
· Tablespace 크기는 5M, 1개의 데이타 파일 가짐, Tablespace 저장영역을 'c:\temp\sp_test1', 매개변수를 명시적 설정, Tablespace를 Offline

     SQL> CREATE TABLESPACE sp_test
          DATAFILE '/oracl_data/sp_test1.dbf' SIZE 5M
          DEFAULT STORAGE(
                  INITIAL 50K
                  NEXT 50K
                  MINEXTENTS 2
                  MAXEXTENTS 50
                  PCTINCREASE 0) OFFLINE;
· 여기서 데이타파일 경로를 지정하지 않는 경우에는 현재 디렉토리에 데이타 파일을 생성

Temporary Tablespace 생성
다중 SORT 작업의 수행 속도 개선이나 오버헤드를 감소, ORACLE 저장영역관리 작업을 피하고자 할때 사용
단지 Sort Segment를 사용할 수 있게하는 Tablespace
Temporary Tablespace에는 영구적인 자료저장 불가능
v$sort_segment
Temporary Tablespace의 Sort Segment의 저장영역할당, 해제에 대한정보
   SQL> desc v$sort_segment;

     Name                            Null?    Type
     ------------------------------- -------- ----

  	TABLESPACE_NAME                          VARCHAR2(31)
  	SEGMENT_FILE                             NUMBER
	SEGMENT_BLOCK                            NUMBER
  	EXTENT_SIZE                              NUMBER
  	CURRENT_USERS                            NUMBER
  	TOTAL_EXTENTS                            NUMBER
  	TOTAL_BLOCKS                             NUMBER
  	USED_EXTENTS                             NUMBER
  	USED_BLOCKS                              NUMBER
  	FREE_EXTENTS                             NUMBER
  	FREE_BLOCKS                              NUMBER
  	ADDED_EXTENTS                            NUMBER
  	EXTENT_HITS                              NUMBER
  	FREED_EXTENTS                            NUMBER
  	FREE_REQUESTS                            NUMBER
  	MAX_SIZE                                 NUMBER
  	MAX_BLOCKS                               NUMBER
  	MAX_USED_SIZE                            NUMBER
  	MAX_USED_BLOCKS                          NUMBER
  	MAX_SORT_SIZE                            NUMBER
  	MAX_SORT_BLOCKS                          NUMBER

Tablespace를 생성하는 동안 Tablespace를Temporary Tablespace으로 설정
       SQL> CREATE TABLESPACE sp_test TEMPORARY; 
기존의 Tablespace를Temporary Tablespace으로 설정
       SQL>ALTER TABLESPACE sp_test TEMPORARY; 
Temporary Tablespace를 Offline으로 설정 가능하고 Tablespace 상태를 Online/Offline으로 바꿔도 Tablespace의 Temporary상태는 변경 안됨

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
[펌] 오라클 TableSpace 및 사용자 생성  (0) 2007.11.27
[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27

/*
id : sys
pw : change_on_install
NPXTS_LDARDATA2 / NPXTS_LDARINDEX2
*/

/* 테이블 스페이스 생성(datafile의 path는 적절히) */
/* data table space 생성 */
create tablespace NPXTS_LDARDATA2
datafile 'd:\database\NPXTS_LDARDATA2.dbf' size 300m
autoextend on next 100m maxsize unlimited
default storage (initial 1m
    next 5m
    minextents 1
    maxextents unlimited
    /* pctfree 10 */
    /* pctincrease 50 */);
   
/* index table space 생성 */
create tablespace NPXTS_LDARINDEX2
datafile 'd:\database\NPXTS_LDARINDEX2.dbf' size 300m
autoextend on next 100m maxsize unlimited
default storage (initial 1m
    next 5m
    minextents 1
    maxextents unlimited
    /* pctfree 10 */
    /* pctincrease 50 */);
   

/* 사용자 생성 */
create user ldar20042
identified by ldar20042
default tablespace NPXTS_LDARDATA2
temporary tablespace temp
quota unlimited on NPXTS_LDARDATA2
quota unlimited on NPXTS_LDARINDEX2;

/* 사용자에 권한부여 */
grant connect to ldar20042;

/* 모두 지우고 다시시작할 경우 SYS로 접속하여 다음을 실행 */
/*
drop user ldar21_sm cascade;
drop tablespace ldar21_data including contents;
drop tablespace ldar21_index including contents;
*/

/*
drop user ldar2004 cascade;
drop tablespace NPXTS_ldardata including contents;
drop tablespace NPXTS_ldarindex including contents;
*/

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27
[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27
[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27

오라클 9i R2의 Table Compression

 

RDBMS를 사용한 이래로 점점 더 많은 정보가 데이타베이스에 쌓이고 있으며 Telecom 업무와 같은 다량의 데이타를 관리하는 경우 수 테라에서 수십 테라바이트에 이르는 방대한 데이타를 관리해야 하는 어려움에 직면해 있으며 데이타의 양에 비례하여 하드웨어의 비용도 증가하고 있는 것이 현실이다.

이에 대한 대안으로 오라클 9i R2에서 새로 선보인 TABLE Compression 방법에 대해 알아보고 이를 활용하여 얼마나 물리적인 저장공간을 줄일 수 있으며 대량의 데이타를 분석해야 하는 DW 환경에서 성능상 어느 부분에 영향을 미치고 온라인의 어느 경우에 사용가능한지 성능을 비교해 보고자 한다.

TABLE Compression방법은 DB2와 같은 타 DBMS에서는 이미 사용되고 있는 방법으로 오라클은 Oracle 9i Release2에서 기능이 추가되었다.

오라클의 Table Compression의 특징은 다음과 같다.

  • TABLE, TABLE Partition, Materialized View에서 사용할 수도 있으며 Tablespace 단위로 지정 가능하다.
  • Block 단위로 I/O를 수행하므로 물리적 I/O가 감소한다.
  • Lossless dictionary-based 알고리즘을 사용하여 block내 중복값을 제거하는 압축방법을 사용한다.
  • Compression 및 Decompression은 ROW 단위로 수행되며 Row level locking은 유효하다.
  • Data의 Compression Ratio는 온라인 30~80% DW의 경우 400%까지도 가능하며 데이타 분포도에 따라 다를 수 있다.

1. Compression의 원리

오라클에서 채택하고 있는 Compression방법은 Data Segment Compression 또는 heap-organized block-level compression라고도 하며 한 block내에서 복원되어야 하는 정보는 그 Block내에 모두 존재해야 한다.

아래의 그림은 주문 Table에 고객 정보가 같이 있는 경우를 가정하고 Block내의 압축 저장원리를 설명하였다.


압축된 Block과 압축되지 않은 Block의 비교

이는 column 길이와 중복값의 정도에 따라 모든 중복값은 Symbol Table의 해당값을 참조하고 있으며 압축의 결과로 column의 순서가 해당 block내에서 재정렬 될 수도 있다. 오라클의 Symbol Table Entry는 최적의 Compression 결과를 위해 Data Loading시에 시스템에 의해 결정되어 생성되므로 Symbol Table Entrty를 사용자의 임의로 변경할 필요가 없다. 오라클 알고리즘은 압축 factor와 별도로 분포도의 변경에 대하여 동적으로 변경사항에 대하여 적용된다.


2. Compression Ratio(압축율)

압축율은 데이타의 분포도에 따라 다르지만 DW환경에서는 2:1, 4:1 많은 경우 12:1 까지도 압축되기도 한다. 각 Block의 중복값을 제거하는 알고리즘을 사용하므로 데이타 로드시에 Cardinality가 낮은 값으로 정렬해서 data를 Loading하는 방법이 좋다. DW상황의 Materialized View는 대부분 Group by에 의해 정렬된 값을 생성하는 경우가 많으므로 높은 Compression Ratio을 유지할 수 있다. 또한 block size가 클수록 한 Block내에 중복값이 많이 포함될 수 있으므로 compress Ratio에 영향을주며 Storage Parameter 인 PCTFREE가 낮을수록 Block내에 많은 양의 데이타의를 저장할 수 있으므로Compression Ratio가 높아진다. UPDATE 작업이 거의 없는 Compressed Table에는 PCTFREE를 0로 하는 것이 좋으며 compress option을 사용하여 table creation시에는 default PCTFREE 0으로 지정된다.


3. Compression 대상

Compress 대상은 Table, Materialized View, Partition table의 개별 Partition별로 Compress option지정이 가능하다. Tablespace level에서 지정한 경우 tablespace내에 생성되는 모든 Table들은 default로 Compress option이 적용된다. Table의 Compress option은 변경도 가능하지만 이후에 입력되는 데이타만 Compression의 적용 대상이 된다.

bulk insert나 bulk load시의 Compresion이 일어나는 시기는

  • Direct Path SQL*Loader 사용시
  • Create Table as SELECT(CTAS) 문장 사용시
  • Parallel INSERT ( 또는 append hint를 통한 Serial INSERT) 문장 사용시에 발생한다.

ALTER TABLE TABLE_NAME MOVE COMPRESS;

명령을 통하여 기존에 존재하는 table에 compress option을 지정할 수 있으나 table 전체에 Exclusive Lock 상태로 작업을 진행하므로 이를 고려하여 다른 DML 작업에 영향이 미치지 않도록 해야한다. Compress 적용 Data type은 LOB와 LOB에서 파생된 CLOB등을 제외한 모든 Type에 적용 가능하다.

partition table과 non-partitioned table의 compression여부를 확인하는 dicitionary는 아래의 SQL을 통해 확인해 볼 수 있다.

1) partitioned table

SELECT TABLE_NAME, PARTITION_NAME, COMPRESSION
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME LIKE UPPER(:TAB_NAME)||"%";

2) non-partitioned table

SELECT E.OWNER, E.SEGMENT_NAME, E.SEGMENT_TYPE, S.SPARE1,
DECODE(S.SPARE1,1,"NORMAL",6145,"COMPRESSED",4097,"COMP->NOCOMP","OTHER") COMP_TYPE
FROM SYS.SEG$ S, DBA_EXTENTS E
WHERE E.SEGMENT_NAME LIKE UPPER(:seg_name)||"%"
AND E.SEGMENT_TYPE = "TABLE"
AND E.EXTENT_ID = 0
AND E.BLOCK_ID = S.BLOCK#
AND E.FILE_ID = S.FILE#;

4. Compression/non-Compress Table 성능비교

물리적인 compress ratio는 데이타의 분포도에 따라 다르다. 주로 DW의 데이타의 경우 Cardinality가 낮으나 OLTP성 Transaction 데이타의 경우 Cardinality가 높아 중복 값의 비중이 낮은 경우가 많다. Compression ratio가 높을수록 Data file size나 Redo log file Size가 줄어들게 되므로 Backup /Recovery등 유지보수 효과를 높여줄 뿐만아니라 , Database buffer cache의 Hit Ratio 향상에 도움을 주고 물리적인 DISK I/O를 줄여주는 효과가 있다.

아래의 테스트는 OLTP성 TABLE중 대리점 TABLE로 TEST한 결과이다. e-mail, fax, 주소, 전화번호등 정보등 주로 Cardinality가 높은 편이다.


<그림2> OLTP성 TABLE의 압축율과 SQL 성능비교


결과를 보면 생성시에는 압축시에 2배이상의 시간이 필요하며 압축율은 50%정도의 compression ratio를 보이고 있으며 50%의 Compress ratio에서는 SELECT시의 속도 TEST시 거의 차이가 나타나지 않음을 알 수 있다. Update시에는 40~70% 정도 더 낮은 성능이 나타나는데 이는 압축된 Table의 update시 더 복잡한 operation 과정이 필요하고 PCTFREE등의 Storage Parameter등의 영향으로 판단된다. Delete는 평균 30%정도의 성능향상을 보였는데 이는 data의 압축으로 logging data의 양도 줄어들게 되고 row의 길이가 줄어들게 되어 1 Block내에 더 많은 Row를 포함하는 등의 영향에 따른 것으로 판단된다.아래의 경우는 DW Star Schema하에서의 압축율을 보여주고 있다.


<그림3> DW Star Schema 모델상황의 Compression Ration 비교

위의 그림에서는 300%이상의 Compression Ratio를 보이고 있는데 이와 같이 중복 Value가 많아 Compression Ratio가 높고 DML작업이 적은 DW 환경에서 Compression Option을 사용하는 것이 좋으며, 이와는 반대로 update 빈도가 높은 OLTP 환경에서는 사용시 Performance에 문제를 발생시킬 수 있으므로 사전 Sampling을 통하여 최소 50%이상의 압축율을 보이는지 여부와 DML 사용정도등을 조사한 후 DML의 요구가 많지 않은 집계성 Table에 사용할 것을 권장한다.

오라클 sysdate...

프로그래밍/DB 2007. 11. 27. 14:18 Posted by galad

select to_char(t1,'yyyy-mm-dd hh24:mi:ss'), to_char(t2,'yyyy-mm-dd hh24:mi:ss') from test;

TO_CHAR(T1,'YYYY-MM TO_CHAR(T2,'YYYY-MM
------------------- -------------------
2004-11-19 10:52:35 2004-11-19 10:53:35


초단위까지 보고 싶을때...

출처 블로그 > 살아가는 이야기
원본 http://blog.naver.com/tinylass/120011094923

Export 및 Import 유틸리티 개요

  • Export 유틸리티는 다음에 대한 논리적 백업을 제공합니다.
    - 데이터베이스 객체
    - 스키마 객체
    - 테이블스페이스
    - 전체 데이터베이스
  • Import 유틸리티는 데이터베이스로 데이터를 옮기기 위해 유효한 엑스포트 파일을 읽는 데 사용됩니다. 엑스포트 파일에서 임포트된 객체에는 리두 로그 기록을 적용할 수 없으므로 데이터 손실이 발생할 수는 있지만 이를 최소화할 수 있습니다.

DBA는 Export 및 Import 유틸리티를 사용하여 다음과 같은 작업을 수행함으로써 일반적인 운영 체제 백업을 보완할 수 있습니다.

  • 데이터베이스 객체 또는 전체 데이터베이스의 기록(historical) 아카이브 생성. 변화하는 업무 요구 사항을 지원하기 위해 스키마를 수정하는 경우가 여기에 해당됩니다.
  • 이진 파일에 테이블 정의 저장. 주어진 스키마 구조의 기준선(baseline)을 생성 및 유지 관리할 때 유용합니다.
  • Oracle 버전 간의 데이터 이동. Oracle7에서 Oracle8로 업그레이드하는 경우를 예로 들 수 있습니다.
  • 다음과 같은 경우를 방지합니다.
    - 실수로 테이블을 삭제하거나 절단(truncate)하는 등의 사용자 오류
    - 테이블의 논리적 훼손
    - 데이터베이스의 일부분에만 영향을 주는 잘못된 일괄 처리 작업 또는 DML 문
  • 다음을 복구합니다.
    - 한 물리적 데이터베이스의 개별 테이블스페이스에 여러 논리적 데이터베이스가 존재하는 경우 논리적 데이터베이스 하나를 나머지 물리적 데이터베이스와는 다른 시점으로 복구합니다.
    - VLDB(Very Large Database)에 있는 테이블스페이스를 복구할 때 백업에서 전체 데이터베이스를 복원하여 롤포워드하는 것보다 TSPITR(tablespace point-in-time recovery)이 더 효과적인 경우 이를 복구합니다.

참고: 이 단원에서는 Export 및 Import 유틸리티에 대해 기술하고 이들이 백업 및 복구 작업에 미치는 영향에 대해 설명합니다. 이 유틸리티에 대한 자세한 설명을 보려면 Oracle8i Server Utilities 설명서를 참조하십시오.

 

#################################################

EXPORT 유틸리티 실행방법

 

. 대화식 다이얼로그

. Enterprise Manager 내의 Data Manager의 Export페이지

. 파라미터를 명시함으로써 명령라인 인터페이스

#################################################

 

익스포트 방법

  • 대화식 다이얼로그. 운영체제에서 EXP 명령을 명시하고 아무런 파라미터도 명시하지 않음으로 Export 유틸리티는 디폴트 값을 제공하면서 입력을 위한 프롬프트를 줄 것입니다.
  • Oracle Enterprise Manager 내의 Data Manager의 Export 페이지.
  • 명령 라인 모드를 선택 시 선택된 옵션들은 명백히 명령 라인에 명시되어야 합니다. 어떠한 빠진 옵션들은 Export 유틸리티 디폴트 값들이 될 것입니다.

: 많은 옵션들이 명령 라인 인터페이스를 사용하여야만 이용 가능합니다. 그러나 명령 라인과 함께 파라미터 파일을 사용할 수 있습니다.

엑스포트 방식

  • 대화식 대화상자: 운영 체제에서 매개변수를 사용하지 않고 EXP 명령을 지정하면 Export 유틸리티는 기본값을 제공하면서 입력 프롬프트를 표시합니다.
  • Oracle Enterprise Manager에 포함되어 있는 Data Manager의 엑스포트 페이지
  • 명령행 모드를 선택할 경우 선택한 옵션을 명령행에 명시적으로 지정해야 합니다. 옵션을 누락하면 Export 유틸리티의 기본값이 지정됩니다.

참고: 많은 옵션이 명령행 인터페이스에서만 사용 가능하지만 명령행과 함께 매개변수 파일을 사용할 수도 있습니다.


명령행 엑스포트

Export 유틸리티의 명령행 모드를 사용하여 데이터베이스 데이터를 운영 체제 파일로 복사할 수 있습니다. 이 파일은 Import 유틸리티에서만 읽을 수 있습니다.

예제

행을 포함하여 scott의 스키마에 속한 emp 및 dept 테이블을 포함하는 expincr1.dmp 엑스포트 파일을 생성합니다.

$ exp scott/tiger tables=(emp,dept) rows=y file=expincr1.dmp

행을 포함하여 scott의 스키마에 속한 모든 객체를 포함하도록 expdat.dmp라는 빠른 엑스포트 파일을 생성합니다.

$ exp system/manager owner=SCOTT DIRECT=Y

ts_emp 테이블스페이스에 속한 모든 객체의 정의를 포함하는 expdat.dmp 엑스포트 파일을 생성하고 ts_emp.log 로그 파일을 생성합니다.

$ exp system/manager TRANSPORT_TABLESPACE=y TABLESPACES=(ts_emp) LOG=ts_emp.log

마지막 누적 또는 완전 엑스포트 이후 데이터베이스에서 수정된 모든 정의 및 데이터를 포함하는 expcum1.dmp 엑스포트 파일을 생성합니다.

$ exp system/manager FULL=y INCTYPE=cumulative FILE=expcum1.dmp

참고: 명령행 모드 옵션은 대화식 모드 옵션과 유사합니다.

엑스포트 매개변수

매개변수

설명

USERID

엑스포트할 스키마 객체의 사용자 이름/암호

FILE

출력 파일 이름

ROWS

엑스포트 파일에 테이블 행을 포함시킬 것인지 여부: (Y)es/(N)o

FULL

전체 데이터베이스를 엑스포트할 것인지 여부: (Y)es/(N)o

OWNER

엑스포트할 사용자: 사용자 이름

TABLES

엑스포트할 테이블: 테이블 목록

INDEXES

인덱스를 엑스포트할 것인지 여부: (Y)es/(N)o

DIRECT

직접 모드 엑스포트 지정 여부: (Y)es/(N)o

INCTYPE

엑스포트 레벨 유형

PARFILE

매개변수가 지정된 파일 이름

HELP

대화식 모드에서 엑스포트 매개변수 표시(Y)

LOG

정보 및 오류 메시지용 파일 이름

CONSISTENT

엑스포트 중에 데이터가 갱신될 경우 데이터베이스의 읽기 일관성 뷰를 제공할 것인지 여부: (Y)es/(N)o

BUFFER

데이터 버퍼 크기(바이트): (정수)

TRANSPORT_TABLESPACE

이동 가능한 테이블스페이스 메타 데이터의 엑스포트 설정(릴리스 8.1 전용)

TABLESPACES

이동할 테이블스페이스(릴리스 8.1 전용)

POINT_IN_TIME_RECOVER

Export 유틸리티가 Oracle 데이터베이스에 있는 하나 이상의 테이블스페이스를 엑스포트할지 여부 표시(릴리스 8.0 전용)

RECOVERY_TABLESPACES

포인트 인 타임 복구를 사용하여 복구할 테이블스페이스 지정(릴리스 8.0 전용)
Oracle Server Readme, Release 8.0.4 참조

COMPRESS

하나의 확장 영역에 모든 데이터를 포함시킬지 여부 지정: (Y)es/(N)o

참고: 위에 나열한 매개변수는 모든 Export 유틸리티 매개변수의 전체 목록이 아니며 DBA가 복원을 위해 자주 사용하는 매개변수입니다

완전한 익스포트 (Complete Export)
누적적(cumulative)이고 증분적인(incremental) 익스포트를 사용한다면 기본 백업을 생성하기 위해 정기적으로 완전한 익스포트를 수행해야 합니다. 완전한 익스포트 후에 자주 증분적인 익스포트를 수행하고 가끔 누적적인 익스포트를 수행하십시오. 주어진 시간 후에 다른 하나의 완전한 익스포트에 대해 이 사이클을 다시 반복해야 합니다.
위 예에서 보여지는 바와 같이 완전한 데이터베이스 익스포트는 모든 테이블과 데이터 정의를 백업해 줍니다.

제한사항
완전(Full) 데이터베이스 모드 (FULL=Y)로만 완전한, 증분적인 또는 누적적인 익스포트를 수행할 수 있습니다.

증분적인 익스포트 (Incremental Export)
증분적인 익스포트는 임의의 종류의 최근 익스포트 이후 변경된 객체들을 포함합니다. 증분적인 익스포트는 변경된 행 뿐만 아니라 테이블 정의 정보와 모든 테이블 데이터를 익스포트합니다. 전형적으로 여러분은 누적적 또는 완전한 익스포트 보다는 증분적 익스포트를 더욱 자주 수행합니다.

어떤 테이블에 대한 임의의 갱신은 (UPDATE, INSERT, 또는 DELETE) 자동적으로 증분적 익스포트 대상 테이블이 됩니다.


위 예에서 테이블 1, 3, 6은 완전한 익스포트인 Time 1에서 취한 최근 익스포트 이후로 변경이 발생하였습니다.

주: 증분적 익스포트는 몇몇 대형 테이블을 자주 액세스하는 응용 프로그램인 경우 매우 좋은 전략이 될 수 없습니다. 작은 테이블에 걸쳐 변경이 다소간 흩어져 있는 departmentalized 애플리케이션에 적합합니다.

누적적 익스포트 (Cumulative Export)
누적적 익스포트는 가장 최근의 누적적 또는 완전한 익스포트 이후로 변경된 테이블들을 백업합니다.


위 예에서 테이블 1, 2 및 6은 Time 1 이후로 변경되었으며 테이블 4는 Time 2 이후로 변경되었습니다. 따라서 누적적 익스포트는 가장 최근 완전 익스포트 이후로 변경된 모든 테이블들을 백업합니다.

incremental 또는 cumulative export를 수행할 때에는 full=y 파라미터와 함께 inctype 파라미터를 사용합니다.

incremental export 일 경우는,

exp sys/change_on_install file=filename full=y inctype=incremental

cumulative export 일 경우는,

exp sys/change_on_install file=filename full=y inctype=cumulative

와 같이 실행합니다.

증분적 및 누적적 익스포트의 이점
증분적 및 누적적 익스포트는 많은 사용자들이 그들 자신의 테이블들을 생성하는 환경에서 일하는 DBA가 직면하고 있는 문제점들을 해결하는 것을 도와 줍니다. 이런 유형의 익스포트의 이점은 다음과 같은 것을 포함합니다:

  • 사용자가 우연히 삭제시킨 테이블을 DBA가 복원 가능
  • 더 적은 데이터가 익스포트 되기 때문에 더 작은 익스포트 파일 필요
  • 가장 최근의 증분적 또는 누적적 익스포트 이후로 변경된 객체들만 백업되기 때문에 더 적은 시간 소요

Direct Path 익스포트 개념
Direct-Path 기능을 사용함으로써 데이터를 훨씬 더 빨리 추출할 수 있습니다. 파라미터 DIRECT=Y가 명시될 때 Export 유틸리티는 SQL-명령 처리 계층을 통하는 대신 데이터 계층에서 직접적으로 읽습니다.

Direct-Path 익스포트의 구조

  • 익스포트의 direct 모드는 파라미터 DIRECT=Y를 명시함으로써 설정될 수 있습니다.
  • Direct-Path 익스포트는 인스턴스의 다른 자원들과 경쟁하지 않습니다.
  • Direct read 모드의 경우 세션에 의해 사용되는 사적인 영역(private area)으로 데이터 베이스 블록을 읽어 들입니다.
  • 행들은 전송을 위해 Two-Task Command(TTC) 버퍼로 직접 이동됩니다.
  • TTC 버퍼 내의 데이터는 Export 유틸리티가 기대하는 형식으로 되어 있습니다.

Direct-Path 익스포트의 명시
Direct-Path 익스포트 사용 전에 catexp.sql 스크립트를 실행해야 합니다.

DIRECT 파라미터 사용 방법
명령 라인 옵션
DIRECT 명령 라인 파라미터를 사용함으로써 Direct-Path 익스포트를 활성화할 수 있습니다.
  $ exp user=scott/tiger full=y direct=y

파라미터 파일
exp_par.txt란 파라미터 파일의 예:
  USERID=scott/tiger
  TABLES= (emp,dept)
  FILE=exp_one.dmp
  DIRECT=Y

운영체제 프롬프트에서 파라미터를 실행하기 위해:
  $ exp parfile=exp_param.txt

Direct-Path 익스포트
Export 유틸리티의 Direct-Path 옵션은 conventional-path 익스포트와는 구별되는 어떤 기능을 도입합니다.

Direct-Path 기능

  • 익스포트 유형은 화면 출력, 익스포트 덤프 파일 및 LOG 파라미터로 명시한 로그 파일에 표시됩니다.
  • 데이터는 이미 익스포트가 기대하는 형식으로 되어 있으며 이로써 불필요한 데이터 전환을 피해 줍니다. 데이터는 Export 클라이언트에게 이동되는데 이 클라이언트가  익스포트 파일에 데이터를 씁니다.
  • Direct-Path 익스포트는 최적화된 “SELECT * FROM table”을 어떤 형용사구 없이 사용합니다.

주: 열 데이터의 형식이나 익스포트 덤프 파일의 명세는 conventional-path 익스포트와는  다릅니다.

Direct-Path 제한 사항
Export 유틸리티의 direct-Path 옵션은 conventional-path 익스포트와 구별해 주는 어떤 제한 사항들을 갖고 있습니다.

  • Direct-Path 익스포트 기능은 대화식 EXP 세션을 사용하여 활성화될 수 없습니다.

  • Direct-Path 옵션이 사용될 때 클라이언트측의 문자 집합은 서버측의 문자 집합과  일치해야 합니다.

  • Export 유틸리티의 BUFFER 파라미터는 Direct-Path 익스포트에 아무런 영향을  미치지 않는데 이 파라미터는 conventional-path 옵션에 의해서만 사용됩니다.

  • VARRAY 열 및 중첩된 테이블을 포함하여 LOB, BFILE, REF 또는 객체형 열을  갖고 있는 행을 direct-Path로 임포트 할 수 없습니다. 데이터가 아니라 테이블을  생성하기 위한 데이터 정의 정보만 익스포트 됩니다.

Export 유틸리티의 호환성
DBA로서 Export 유틸리티와 관련된 호환성 문제를 알 필요가 있습니다.

문제점

  • 오라클7 익스포트 파일을 생성하기 위해 오라클8 데이터베이스에 대해 오라클7 Export 유틸리티를 사용할 수 있습니다.

  • 오라클6 (또는 이전) Export는 오라클8 데이터베이스에 대해 사용될 수 없습니다.

  • 낮은 버젼의 Export 유틸리티가 더 높은 버젼의 오라클 서버와 실행될 때 낮은 버젼에서 존재하지 않았던 데이터베이스 객체들의 범주는 익스포트로부터  제외됩니다.

  • 테이블이 Direct-Path 옵션을 사용하여 생성되었다면 이 파일은 다른 포맷으로  되어있으며 오라클7.3 이전 Import 유틸리티에 의해 읽혀질 수 없습니다.

  • 더 낮은 버젼의 오라클 서버 Import를 사용하여 더 높은 버젼의 Export 이용을 시도할 때 자주 에러를 산출합니다.

Import 유틸리티
Import 유틸리티는 유효한 Export 유틸리티 파일을 사용하여 데이터 복구 시 사용될 수 있습니다.

복구 위해 Import 유틸리티의 사용

  • 테이블 정의 정보는 익스포트 파일에 저장되기 때문에 테이블 정의 정보 생성. 행없이 데이터 임포트 선택시 단지 테이블 정의 정보만 생성할 것입니다.

  • 테이블, 사용자 또는 Full 임포트 모드를 사용하여 유효한 익스포트 파일로부터 데이터 추출.

  • 완전한, 증분, 또는 누적적인 익스포트 파일로부터 데이터 임포트.

  • 이전에 언급한 방법들 중 하나를 사용하여 어떤 테이블이 우연히 삭제되거나 truncate  되는 사용자 장애 에러로부터 복구

Table 모드

Table 모드는 모든 테이블을 임포트하지 않고 사용자 스키마에서 지정된 모든 테이블을 임포트합니다. 권한 있는 사용자는 다른 사용자 소유의 지정된 테이블을 임포트할 수 있습니다.

User 모드

User 모드는 사용자 스키마에 있는 모든 객체를 임포트합니다. 권한 있는 사용자는 지정된 사용자 집합의 스키마에 있는 모든 객체를 임포트할 수 있습니다.

Tablespace 모드

Tablespace 모드를 사용하면 권한 있는 사용자가 Oracle 데이터베이스 간에 테이블스페이스 집합을 이동할 수 있습니다.

Full Database 모드

Full Database 모드는 SYS 스키마에 있는 객체를 제외한 모든 데이터베이스 객체를 임포트합니다. 이 모드에서는 권한 있는 사용자만 임포트를 수행할 수 있습니다.

예제

expincr1.dmp 엑스포트 파일을 사용하여 행을 포함해 emp 및 dept 테이블을 scott 스키마로 임포트합니다.

$ imp scott/tiger tables=(emp,dept) rows=y file=expincr1.dmp

expincr1.dmp 엑스포트 파일을 사용하여 행을 포함해 Scott 스키마에 속한 모든 객체를 임포트합니다.

$ imp system/manager FROMUSER=scott file=expincr1.dmp

expdat.dmp 엑스포트 파일을 사용하여 ts_emp 테이블스페이스에 속한 모든 객체의 정의를 임포트합니다.

$ imp system/manager TRANSPORT_TABLESPACE=y TABLESPACES=ts_emp

참고: 명령행 모드 옵션은 대화식 모드 옵션과 유사합니다.

임포트 매개변수

매개변수

설명

USERID

임포트할 스키마 객체의 사용자 이름/암호

FILE

입력 파일의 이름. 유효한 Export 유틸리티 파일이어야 합니다.

ROWS

임포트 파일에 테이블 행을 포함시킬지 여부

IGNORE

해당 객체가 존재할 경우 생성 오류 무시

FULL

전체 파일 임포트

TABLES

임포트할 테이블

INDEXES

인덱스를 임포트할 것인지 여부

INCTYPE

증분 임포트 유형 지정. SYSTEM 및 RESTORE 옵션이 있습니다.

PARFILE

매개변수 사양 파일

HELP

대화식 모드에서 엑스포트 매개변수 표시

LOG

정보 및 오류 메시지용 파일

DESTROY

데이터베이스를 구성하는 기존 데이터 파일을 재사용해야 할지 여부 지정

FROMUSER

임포트할 객체를 포함하는 스키마 목록

TOUSER

임포트할 스키마를 소유한 사용자 이름 목록 지정

INDEXFILE

인덱스 생성 명령을 받을 파일 지정

TRANSPORT_TABLESPACE

엑스포트 파일에 있는 이동 가능한 테이블스페이스 메타 데이터를 Import 유틸리티가 임포트하도록 명령

TABLESPACES

데이터베이스로 이동할 테이블스페이스 목록

DATAFILES

데이터베이스로 이동할 데이터 파일 목록

TTS_OWNERS

이동 가능한 테이블스페이스 집합에 있는 데이터를 소유한 사용자 목록

POINT_IN_TIME_RECOVER

Import 유틸리티가 나머지 데이터베이스에 영향을 주지 않고 Oracle 데이터베이스에 있는 하나 이상의 테이블스페이스를 이전 시점으로 복구할지 여부 표시(릴리스 8.0 전용)

참고: 위에 나열한 매개변수는 모든 Import 유틸리티 매개변수의 전체 목록이 아니며 DBA가 복원 작업을 위해 자주 사용하는 매개변수입니다.

임포트 과정 순서
테이블을 임포트할 때 익스포트 파일이 읽혀지고 테이블과 데이터는 다음 순서로 생성됩니다.

  1. 새로운 테이블이 생성됩니다. 요점은 이 테이블은 기술적으로 오라클에 새로운 (NEW) 테이블들입니다. 그들은 원래 테이블들과 같은 데이터 및 성격을 가지고 있으나 사실상 이 테이블들은 데이터베이스에 새로이 생성되어 집니다. 이것은 논리적으로 아카이브 로그 파일이 이 테이블들에 적용되어 질 수 없는 이유인데, 아카이브 로그는 새로이 생성된 테이블에 기술적으로  아무런 갱신도 하지 않기 때문입니다.

  2. 인덱스 구조가 구축됩니다. DBA는 INDEXES=N으로 설정하고 임포트 과정 다음에 인덱스를 구축함으로써 임포트 과정 동안 어느 정도의 시간을 절약할 수 있습니다.이것은 임포트를 지원하기 위해 요구되는 롤백 세그먼트의 개수를 또한 제한할 것입니다.

  3. 데이터는 테이블에 임포트되나 ROWS=Y인 경우에만 그렇습니다. 인덱스는 채워집니다. INDEXES=Y가 명시될 때 인덱스는 테이블과 더불어 생성되며 따라서 데이터 임포트와 더불어 갱신됩니다.

  4. 트리거가 임포트되고 무결성 제약 조건들이 새로운 테이블에 대해 활성화됩니다.

테이블 임포트 순서는 중요할 수 있습니다. 예를 들어 외래키(foreign key)를 갖고 있는 테이블이 기본키(primary key)를 갖고 있는 테이블에 referential check을 갖고 있다면 외래키(foreign key) 테이블이 먼저 임포트 될때 아직 임포트 안된 기본키를 참조하는  모든 행은 제약조건이 활성화되어 있다면 거절될 것입니다. 전체 데이터베이스 익스포트할 때에는 문제가 안됩니다

NLS 고려사항
하나의 문자 집합을 사용하는 오라클 데이터베이스에서 다른 문자 집합을 사용하는 데이터베이스로 데이터 이동 시 데이터 전환이 적절하게 처리되어야 함을 확인하십시오. NLS_LANG 환경 변수를 데이터가 익스포트 되어질 데이터베이스의 문자 집합 정의로 설정함으로써 해결할 수 있습니다. 이것을 올바르게 설정하지 않을 때  데이터의 원치 않는 문자 전환을 야기하여 데이터의 손실을 유발할 수 있습니다.


미국 영어같은 7-bit ASCII 문자 집합에서 덴마크어 같은 8 비트 문자 집합으로 전환시 모든 문자가 덴마크어 알파벳에서와 동일한 문자를 가지고 있기 때문에 어떤 전환도 필요 없습니다. 덴마크어 같은 8 비트 ASCII 문자 집합에서 미국 영어 같은 7 비트 문자 집합으로 전환시 미국 알파벳에 없는 추가 덴마크어 문자들은 물음표(?)로 전환되게 합니다. 이 경우에 물음표는 적절한 결과인 알려지지 않은 덴마크어 문자로 치환됩니다.

지침

  • 8 비트씩 데이터 이동 시 문자들이 손실되는지 아닌지는 데이터 입력을 위해 사용되는 언어의 명세에 달려 있습니다. 예를 들어 스페인 알파벳은 덴마크 알파벳에는 없는 문자를 가지고 있으므로 스페인어 데이터베이스로부터 덴마크어 데이터베이스로 데이터 이동 시 데이터 변환을 초래할 것이며  따라서 이런 문자들의 손실도 가능하게 될 것입니다.

  • 여러 바이트씩 데이터 이동시도 다중 바이트 언어의 명세에 달려 있습니다.

요약 참조

  관련 내용

  참조

  파라미터

  None

  동적 성능 뷰

  None

  데이터 딕셔너리 뷰

  None

  명령

  Exp
  Imp

  • DEPT Table(Master Table), EMP Table(Child Table) 을 EXPORT 하려한다. 그러나 EXPORT 수행 중에 DEPT, EMP Table 모두 변경될 가능성이 많을 경우 두 Table 의 Data 일관성을 보장하기 위해 사용해야 하는 Option 은?
    A. CONSISTENT
    B. DIRECT
    C. COMPRESS
    D. ROWS
O



 

  • Direct Path EXPORT 설명 중 옳지 않은 것은?
    A. Database 자원에 대해 다른 사용자들과 경쟁하지 않는다.
    B. Database Block 을 Session 이 사용하는 Private Area 로 읽어 들인다.
    C. I/O 버퍼의 크기를 지정하기 위해 BUFFER Option 을 사용한다.
    D. 전송을 위해 TTC 버퍼로 직접 행을 전송한다.
O



 

  • Direct-path 방식의 export 에서 사용할수 없는 option 은?
    A. BUFFER
    B. RECORDLENGTH
O



 

  • EXPORT Option INCTYPE 설명 중 옳지 않은 것은?
    A. COMPLETE 는 모든 Table Data, Definition 을 Export 한다.
    B. INCREMENTAL 은 최근의 COMPLETE, CUMULATIVE, INCREMENTAL 이후에 갱신된 Table 을 Export 한다.
    C. CUMULATIVE 는 최근의 COMPLETE, CUMULATIVE 이후에 갱신된 Table 을 Export 한다.
    D. INCTYPE Option 사용 시 변경된 Record 만 Export 된다.
X 정답:D



 

  • Entire database 를 export 하려한다. 또한 export 되는 시점의 consistent 한 상태로 export 하려할때 그 명령은 다음 중 어느 것인가?
    A. EXP CONSISTENT=Y
    B. EXP FULL=Y CONSISTENT=Y
    C. EXP FULL=Y
    D. EXP FULL=Y CONSISTENT=Y TABLES=(s_emp)
X 정답:B



 

  • Export files 은 Import utility 에 위해서만 Database 에 object 를 재성성 할수 있다?
    A. TRUE
    B. FALSE
O



 

  • Export utility 에서 사용가능한 export mode 는? (multiple choice)
    A. a. Column
    B. Full database
    C. Grant
    D. User
    E. Table
O



 

  • IMPORT 시 Rollback Segment 에 관련된 Error 를 방지하기 위해 COMMIT Option 을 사용한다?
    A. TRUE
    B. FALSE
X 정답:A



 

  • IMPORT 시 Table 과 Data 가 생성되는 순서가 옳은 것은?
    A. Data Import -> Table 생성 -> Index 생성 -> Trigger, Constraints Enable
    B. Table 생성 -> Data Import -> Trigger, Constraints Enable -> Index 생성
    C. Table 생성 -> Index 생성 -> Data Import -> Trigger, Constraints Enable
X 정답:C



 

  • Logical backup 에 대해 archived redo log file 를 적용하여 복구할수 있다?
    A. TRUE
    B. FALSE
O



 

  • Table 을 Import 할때 default 로 system tablespace 에 생성된다?
    A. TRUE
    B. FALSE
O



 

  • dba.dmp export file 에 있는 모든 table 을 import 할려면 다음 중 맞는 것은?
    A. IMP system/manager FILE=DBA.DMP TABLES=FULL
    B. IMP system/manager FILE=DBA.DMP FULL=Y
    C. IMP system/manager FILE=DBA.DMP FULL,USERS=Y
    D. IMP system/manager FILE=DBA.DMP SHOW=Y
O

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27
오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27

1. 오라클 사용자 계정 추가

sqlplus /nolog

connect / as sysdba

CREATE TABLESPACE PORTAL_DAT
    DATAFILE '/data1/portal_dat.dbf' SIZE 500m
    DEFAULT STORAGE ( INITIAL 524288
                      NEXT 524288
                      MINEXTENTS 2
                      MAXEXTENTS 512
                      PCTINCREASE 0 ) ;
                     
create TABLESPACE PORTAL_TEMP_DAT DATAFILE
                      '/data1/portal_temp_dat.dbf' size 500m
                     
/

CREATE TABLESPACE PORTAL_IDX
    DATAFILE '/data1/portal_idx.dbf' SIZE 500m
    DEFAULT STORAGE ( INITIAL 524288
                      NEXT 524288
                      MINEXTENTS 2
                      MAXEXTENTS 512
                      PCTINCREASE 0 ) ;
/

CREATE USER portal123 IDENTIFIED BY portal123
DEFAULT TABLESPACE PORTAL_DAT
TEMPORARY TABLESPACE temp;

ALTER USER portal123 IDENTIFIED BY portal123
DEFAULT TABLESPACE PORTAL_DAT
TEMPORARY TABLESPACE temp;

GRANT CONNECT, RESOURCE TO portal123;

'프로그래밍 > DB' 카테고리의 다른 글

오라클 sysdate...  (0) 2007.11.27
[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27

[펌] mysql 명령어 모음

프로그래밍/DB 2007. 11. 27. 14:15 Posted by galad
출처 블로그 > 고감각의 창조를 위한 지식레시피
원본 http://blog.naver.com/kogamgac/60029140770

mysql 명령어 모음

 

# root암호설정 - root로 로그인하여 해야함
% mysqladmin -u root password '변경암호'
% mysqladmin -u root -p기존암호 password '변경암호'


root암호변경설정
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
This is done with:
/usr/bin/mysqladmin -u root -p password 'new-password'
/usr/bin/mysqladmin -u root -h ns.dbakorea.pe.kr -p password 'new-password'


DB작업
DB생성: mysql> create database DB명 ( or % mysqladmin -u root -p create DB명 )
DB삭제: mysql> drop database DB명
DB사용: mysql> use DB명 (엄밀히 말하자면, 사용할 'default database'를 선택하는 것이다.)
DB변경: mysql> alter database db명 DEFAULT CHARACTER SET charset (4.1이상에서만 available)


This article comes from dbakorea.pe.kr (Leave this line as is) MySQL 연결
mysql -u 사용자 -p DB명 ( or % mysqladmin -u root -p drop DB명 )

데이터파일 실행(sql*loader기능)
mysql>load data infile "데이터파일" into table 테이블명 ;
데이터파일에서 컬럼구분은 탭문자, Null값은 /n로 입력
데이터파일의 위치는 /home/kang/load.txt 와 같이 절대경로로 지정할것.

질의 파일 실행
쉘프롬프트상에서
mysql -u 사용자 -p DB명 < 질의파일
or
mysql프롬프트상에서
mysql> source 질의파일

쉘프롬프트상에서 질의 실행
dbakorea@lion board]$ mysql mysql -u root -pxxxx -e \
>            "INSERT INTO db VALUES(
>            'localhost', 'aaa', 'aaa',
>            'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y')"


사용자 생성 & 사용자에게 DB할당
shell> mysql --user=root -p mysql

mysql> INSERT INTO user VALUES('localhost','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','DB명','사용자','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('%','DB명','사용자','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES; (or shell prompt: mysqladmin -u root -pxxxx reload)

CASE 2: GRANT명령을 이용한 사용자 생성(이 방법이 권장된다)
kang이라는 DB를 만들고, 이 DB를 아래에서 나열된 권한을 가진 kang이라는 사용자를 생성
create database kang;
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';

mysql> create database kang;
Query OK, 1 row affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
Query OK, 0 rows affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';
Query OK, 0 rows affected (0.01 sec)

mysql>

여러가지 명령정리
mysql> show variables;                                              서버의 variables(설정사항)출력
mysql> show variables like 'have_inno%'                             조건에 맞는 variables만 출력
mysql> show databases;                                              database목록
mysql> show tables;                                                 현재DB의 테이블목록(temporary table은 출력하지 않음)
mysql> show tables from db명;                                       지정된 db명이 소유한 테이블목록
mysql> show tables like 'mem%';                                     조건에 맞는 테이블목록만 출력
mysql> show index from 테이블명;                                    인덱스 보기
mysql> show columns from 테이블명;                                  테이블구조(describe 테이블명, explain 테이블명)
mysql> show table status;                                           현재 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show table status from db명;                                 지정된 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show create table 테이블명;                                  해당 테이블 생성 SQL문 출력
mysql> rename table 테이블1 to 테이블2;                             테이블명 변경(ALTER TABLE 테이블1 RENAME TO 테이블2)
mysql> rename table 테이블1 to 테이블2, 테이블3 to 테이블4;         rename multiple tables
mysql> rename table db1명.테이블명 to db2명.테이블명;               테이블을 다른 DB로 이동
mysql> alter table 테이블명 add 컬럼명 데이터타입;                  컬럼추가
mysql> alter table 테이블명 del 컬럼명;                             컬럼제거
mysql> alter table 테이블명 modify 컬럼명 컬럼타입;                 컬럼명에 지정된 컬럼타입의 변경
mysql> alter table 테이블명 change old컬럼명 new컬럼명 컬럼타입     컬럼명 변경
mysql> alter table 테이블명 type=innodb;                            테이블type변경
mysql> create table 테이블명(..) type=heap min_rows=10000;          10000row를 수용할 수 있을 만큼 메모리할당(heap type이므로)
mysql> select version();                                            MySQL서버버전 출력
mysql> create table 테이블2 as select * from 테이블1;               테이블1과 동일한 테이블 생성(with 데이터, as는 생략가능)
mysql> create table 테이블2 as select * from 테이블1 where 1=2;     테이블1과 동일한 구조의 테이블 생성(without 데이터, 1=2는 0으로 할수도 있다.)
mysql> insert into 테이블2 select * from 테이블1;                   테이블1의 데이터를 테이블2에 insert


테이블이 존재여부 파악
DROP TABLE IF EXISTS 테이블명;
CREATE TABLE 테이블명 (...);
프로그래밍 언어에서 COUNT(*)를 사용하여 질의가 성공하면 테이블이 존재함을 파악할 수 있다.
ISAM, MyISAM의 경우 COUNT(*)가 최적화되어 상관없으나, BDB, InnoDB의 경우 full scan이 발생하므로 사용하지 마라.
대신 select * from 테이블명 where 0; 을 사용하라. 질의가 성공하면 테이블이 존재하는 것이고, 아니면 존재하지 않는 것이다.



접속
mysql {-h 접속호스트} -u 사용자 -p 사용DB
-h로 다른 서버에 존재하는 MySQL접속시 다음과 같이 MySQL DB에 설정해줘야 한다.
mysql> INSERT INTO user VALUES('접근을 허용할 호스트ip','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('접근을 허용할 호스트ip','사용DB','사용자','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES; or 쉴프롬프트상에서 % mysqladmin -u root -p flush-privileges


검색조건(where)
regular expression을 지원하다니 신기하군..
mysql> select * from work where 열명 regexp "정규표현식";


백업 & 복구
mysqldump {-h 호스트} -u 사용자 -p DB명 > 백업파일
mysql {-h 호스트} -u 사용자 -p DB명 < 백업파일

mysqldump -u root -p --opt db_dbakorea > dbakorea.sql
mysqldump -u root -p --opt db_board | mysql ---host=remote-host -C database (상이한 머쉰)
mysql -u dbakorea -p db_dbakorea < dbakorea.sql

mysqldump -u root -p --opt db_dbakorea | mysql ---host=ns.dbakorea.pe.kr -C db_dbakorea

테이블 생성구문만을 화면에서 보려면 다음과 같이 --no-data를 사용한다. 테이블명을 생략하면 모든 테이블 출력
mysqldump -u 유저명 -p --no-data db명 테이블명

테이블 검사
isamchk

오라클 sysdate와 동일
insert into test values('12', now());

유닉스 time()함수 리턴값 사용
FROM_UNIXTIME(954788684)
UNIX_TIMESTAMP("2001-04-04 :04:04:04")

MySQL 디폴트 DB&로그파일 위치
/var/lib/mysql
/var/lib디렉토리는 여러 프로세스들이 사용하는 데이터를 저장하는 일종의 파일시스템상의 데이터베이스라고 볼 수 있다.

replace
해당 레코드 존재하면 update하고, 존재하지 않는다면 insert한다.(insert문법과 동일)
replace into test values('maddog','kang myung gyu')'

explain
explain 질의문: 지정한 질의문이 어떻게 실행될 건지를 보여줌
mysql> explain select u.uid, u.name, a.name from sm_user u, sm_addr a where u.uid=a.uid;
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| table | type | possible_keys   | key             | key_len | ref   | rows | Extra |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| u     | ALL  | PRIMARY         | NULL            |    NULL | NULL  |  370 |       |
| a     | ref  | sm_addr_uid_idx | sm_addr_uid_idx |      11 | u.uid |   11 |       |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
2 rows in set (0.01 sec)


temporary table
크기가 큰 테이블에 있는 subset에 대한 질의라면 subset을 temporary table에 저장한 후 질의하는 것이 더 빠를 경우가 있다.
temporary table는 세션내에서만 유효하고(현재 사용자만이 볼수 있다는 뜻), 세션종료시 자동적으로 drop된다.

create temporary table (...);
create temporary table (...) type=heap;        디스크가 아닌 메모리에 테이블 생성

존재하는 permanent table의 테이블명과 동일하게 생성할 수 있으며,
temporary table은 permanent table보다 우선시되어 처리된다.
4.0.7의 감마버전에서 테스트하면 결과는 약간 달라진다. 버그인건지..

mysql> create table test (id varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values('dbakorea');
Query OK, 1 row affected (0.00 sec)

mysql> create temporary table test(id varchar(10));
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
Empty set (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+----------+
| id       |
+----------+
| dbakorea |
+----------+
1 row in set (0.00 sec)



Table Type에 다른 Files on Disk

ISAM   .frm (definition) .ISD (data) .ISM (indexes)
MyISAM .frm (definition) .MYD (data) .MYI (indexes)
MERGE  .frm (definition) .MRG (list of constituent MyISAM table names)
HEAP   .frm (definition)
BDB    .frm (definition) .db (data and indexes)
InnoDB .frm (definition)

보통 mysqldump를 사용하여 백업을 수행하여 다른 DB서버에 데이터를 restore하면 된다.
MySQL은 별다른 작업없이 데이터파일을 단순히 복사(copy)하는 것만으로도 다른 서버에
DB을 이동시킬 수 있다. 하지만, 이런 방식이 지원되지 않는 table type도 있다.

ISAM: machine-dependent format하기때문에..
BDB : .db파일에 이미 테이블위치가 encode되어 있기때문에..
MyISAM, InnoDB, MERGE :가능(machine-independent format)

별다른 지정을 하지 않았다면 디폴트 TABLE type이 MyISAM이므로, 무난히 migration할 수 있다.
floating-point컬럼(FLOAT,DOUBLE)이 있다면 이러한 방식이 실패할 수 도 있다.

쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다.
나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다.
/usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다.

# MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/var/lib/mysql/mysql.sock}
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/tmp/mysql.sock}

위와 같이 하니 /usr/bin/mysql이 /var/lib/mysql/mysql.sock에서 소켓파일을 찾으려 했다.
socket file을 지정하는 --socket이라는 옵션으로 다음과 같이 지정하면 된다.

mysql --socket=/tmp/mysql.sock -u dbakorea -p db_test

하지만 mysql실행시마다 이렇게 써줘야한다는 것이 상당히 귀찮다. 옵션이 바로 적용되게 설정하자.
mysql은 설정사항을 다음 3가지 파일에서 검색한다.

/etc/my.cnf            global options(MySQL 전체적으로 사용되는 옵션 정의)
mysql-data-dir/my.cnf  특정 DB에 적용되는 option (/var/lib/mysql/my.cnf)
~/.my.cnf              사용자 각각의 설정('~'문자는 사용자의 홈디렉토리는 의미)

/usr/share/mysql디렉토리에 예제가 있으므로 참고한다.
소켓파일의 지정은 다음줄을 넣어주면 된다.

socket          = /tmp/mysql.sock


== /etc/my.cnf예 ==
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock



MySQL에서 통계처리시
orderby, groupby 는 sort_buffer를 늘여준다.(show variables)

live table(smslog)에서 모든 질의를 처리하지 말고 summary table에 질의결과를 저장해 재질의 처리한다.
summary table이 heap-type table가 가능한지 확인할 것.

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
     tblTemp1.fldOrder_ID > 100;


join이 subselect보다 빠르다.
join시 사용되는 컬럼은 동일한 column type과 길이를 가져야만 최적의 속도를 보장한다.
즉, 동일 column type이지만 길이가 다르다면(char(11), char(10)), 동일한 컬럼도메인으로 변경해주는 것이 좋다.
where의 in은 optimize되어 있으므로 빠르다
insert,select는 동시에 수행가능하다.(어떻게?)
explain으로 질의과정 점검


varchar to/from char
conversion varchar를 char로 변경할 경우 모든 컬럼타입을 동시에 변경해야 한다.
반대의 경우, 하나만 char->charchar변경시 다른 모든 컬럼도 varchar로 변경됨
참.. 특이하구만..

mysql> CREATE TABLE chartbl (name VARCHAR(40), address VARCHAR(80));
Query OK, 0 rows affected (0.05 sec)

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(40) | YES  |     | NULL    |       |
| address | varchar(80) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> alter table chartbl modify name char(40);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(40) | YES  |     | NULL    |       |
| address | varchar(80) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table chartbl modify name char(40), modify address char(80);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc chartbl;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| name    | char(40) | YES  |     | NULL    |       |
| address | char(80) | YES  |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql>


"For each article, find the dealer(s) with the most expensive price."

표준안
     SELECT article, dealer, price
     FROM   shop s1
     WHERE  price=(SELECT MAX(s2.price)
                   FROM shop s2
                   WHERE s1.article = s2.article);

수정안(최적화)
     CREATE TEMPORARY TABLE tmp (
             article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
             price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);

     LOCK TABLES shop read;

     INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

     SELECT shop.article, dealer, shop.price FROM shop, tmp
     WHERE shop.article=tmp.article AND shop.price=tmp.price;

     UNLOCK TABLES;

     DROP TABLE tmp;



==============================================================================
MySQL 특성정리
==============================================================================
primary key, foreign key지원
index 지원(15개컬럼, 256byte까지)
MySQL에서의 Stored Script개념 => SQL server language
commit-rollback개념 => lock tables(lock table test write -> 트랜잭션.. -> unlock tables)
컬럼명길이: 64자까지, 컬럼 Alias: 256자까지
not case-sensitive: keywords, functions, column, index명
case-sensitive: database, table, alias명
키워드,함수명은 대소문자구별이 없지만, db명과 table명은 Unix계열이라면 case-sensitive하다.
(이는 오브젝트명이 OS의 fs에 따라 저장되기 때문이다. 서버의 lower_case_table_names 변수를
1로 설정하면 오브젝트명은 모두 소문자로 저장되므로 유닉스-윈도간 호환성을 높일 수 있다.

지원되지 않는 부분:
Stored Procedure(5.0이상부터 지원된다고 함)
View(5.0이상부터 지원된다고 함)
Trigger(5.0이상부터 지원된다고 함)
subquery(4.1이상부터 지원된다고 함)
union, union all(4.0이상부터 지원됨)

[테이블 type에 따른 인덱스 특성]
Index Characteristic            ISAM    MyISAM              HEAP        BDB                 InnoDB
NULL values allowed             No      Yes                 As of 4.0.2 Yes                 Yes
Columns per index               16      16                  16          16                  16
Indexes per table               16      32                  32          31                  32
Maximum index row size (bytes)  256     500                 500         500/1024            500/1024
Index column prefixes allowed   Yes     Yes                 Yes         Yes                 No
BLOB/TEXT indexes allowed       No      Yes(255 bytes max)  No          Yes (255 bytes max) No


인덱스 생성
- alter table을 이용한 인덱스 생성이 더 flexible함
- 인덱스명은 생략가능

ALTER TABLE 테이블명 ADD INDEX 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD UNIQUE 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD PRIMARY KEY (인덱스컬럼);
ALTER TABLE 테이블명 ADD FULLTEXT (인덱스컬럼);

CREATE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE FULLTEXT INDEX 인덱스명 ON 테이블명 (인덱스컬럼);

unique인덱스와 primary key인덱스와의 차이
unique은 null허용하지만, primary key는 null허용 안함
unique은 하나의 테이블에 여러개 올 수 있지만, primary key는 하나만 존재

테이블생성시 지정
CREATE TABLE 테이블명
(
  ... column declarations ...
  INDEX 인덱스명 (인덱스컬럼),
  UNIQUE 인덱스명 (인덱스컬럼),
  PRIMARY KEY (인덱스컬럼),
  FULLTEXT 인덱스명 (인덱스컬럼),
...

);


index prefix 생성
- 컬럼의 전체길이중 일부만 인덱스로 사용
- supported for ISAM, MyISAM, HEAP, and BDB tables, but not for InnoDB tables
- 지정되는 길이는 byte단위가 아닌 charater단위이므로, multi-byte character일 경우 주의
- blob, text 컬럼타입일 경우, index prefix 가 유용(255 길이까지 가능)

CREATE TABLE 테이블명
(
  name  CHAR(30) NOT NULL,
  address CHAR(60) NOT NULL,
  INDEX (name(10),address(10))
);


인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
ALTER TABLE 테이블명 DROP PRIMARY KEY;


outer join

[MySQL]
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT  OUTER JOIN t2 ON t1.i1 = t2.i2;
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2;

[Oracle]
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+);
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2;

SELECT
  student.name, student.student_id,
  event.date, event.event_id, event.type
FROM
  student, event
  LEFT JOIN score ON student.student_id = score.student_id
          AND event.event_id = score.event_id
WHERE
  score.score IS NULL
ORDER BY
  student.student_id, event.event_id;
 

:= 문장을 이용한 변수의 설정

현재 dbakorea의 데이터베이스강좌게시판에 등록된 총 게시물은 43개이다. 43개의 강좌를 읽은 수(hit수)는 각각 다르다.
평균 hit수를 구해 보자.

mysql> select @total_hit := sum(hit), @total_record := count(*) from zetyx_board_database;
+------------------------+---------------------------+
| @total_hit := sum(hit) | @total_record := count(*) |
+------------------------+---------------------------+
|                   3705 |                        43 |
+------------------------+---------------------------+
1 row in set (0.00 sec)

mysql> select @total_hit/@total_record as 평균HIT;
+-----------------+
| 평균HIT         |
+-----------------+
| 86.162790697674 |
+-----------------+
1 row in set (0.00 sec)



select substring(subject from 9) from zetyx_board_database where substring(subject, 1, 8) = '[ORACLE]';


보통 상용DBMS들이 row-level locking을 지원한다. 쉽게 말해 레코드단위로 락킹한다는 말이다.
반면, MySQL의 MyISAM 테이블타입은 table-level locking을 사용한다.
쉽게 말하면, insert, update, delete작업은 전체 테이블에 락을 걸고 처리된다는 것이다.
row-level락보다 비효율적이지만,.. MySQL은 빠르기 때문에 이 단점이 상쇄된다.

Compressed MyISAM(packed MyISAM)
정적인 테이블데이터는 압축하여 20-60%정도의 공간을 절약할 수 있다.
Production데이터를 CD로 받아서 차후 디스크에 풀지 않고 CD자체로 바로 사용할 수도 있다.
gzip등으로 백업받으면 이를 푸는 과정이 필요할 것이다.
% myisampack dbakorea.myi

데이터베이스 게시판의 Merge Table에 좀 더 자세한 내용을 적어 두었다.


RAID Table
1개의 테이블은 OS상에 3개의 파일로 구성된다.
스키마파일(.frm), data파일(.myd), index파일(.myi)
MySQL의 RAID테이블은 데이터파일(.myd)을 여러개의 파일들로 구성하는 것이다.

create table raid_test (...)
type=myisam raid_type=striped raid_chunks=4 raid_chunsize=8

테이블을 4개의 데이터파일로 나누고, 8kb단위로(8kb stripe) 라운드로빈 방식으로 write가 이루어진다.

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27
오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27

cmd here!

프로그래밍/Library 2007. 11. 27. 14:14 Posted by galad

'프로그래밍 > Library' 카테고리의 다른 글

Tomcat 다운현상  (0) 2007.11.28
james mail server  (0) 2007.11.28
[펌] james mail server setting  (0) 2007.11.28
[펌] JUnit 설정  (0) 2007.11.28
CVS 설치 후, 사용자 추가하기  (0) 2007.11.28

07 PL/SQL

프로그래밍/DB 2007. 11. 27. 14:12 Posted by galad

★ 프로시져 간단 예제2

- empno 2개를 입력 받아, 첫번째 사람의 sal을 v_sal에 받은 후,

두번째 사람의 sal을 v_sal * 1.2로 바꾼다.


create or replace procedure proc2(a_empno in number, a_empno2 in number)
is
   v_sal number;
begin
   proc1(a_empno, v_sal);   // 미리 만든 proc1을 사용한다.
   update emp set sal = 1.2 * v_sal where empno = a_empno2;
end;
/


show errors


// 결과 확인

SQL> select empno, sal from emp;   // 프로시져 실행 전의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900        950                  // 두번째 사람의 sal을 바꾼다
      7902       3000
      7934       1300                  // 첫번째 사람의 sal을 가져와서

14 개의 행이 선택되었습니다.


SQL>  exec proc2(7934, 7900);

PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> select empno, sal from emp;       // 실행 후의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900       1560             // 7934의 1.2배로 바뀌었다.
      7902       3000
      7934       1300

14 개의 행이 선택되었습니다.





/******************************************************************************
*   파일      : CallTest.java
*   용도      : CallableStatement를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 28
*   Version : 1.0
******************************************************************************/

package CallableStatement;

import java.sql.*;
import java.io.*;
import ConnectionPool.DBConnectionMgr;

public class CallTest
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
        Connection conn = null;
        CallableStatement cstmt = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = 0;
       
        try
        {
           conn = mgr.getConnection();
           cstmt = conn.prepareCall("{call proc1(?, ?)}");   // 함수 호출하는 방식
          
           System.out.print("찾을 사원의 번호은? >> ");
           String str = br.readLine();      // 사원 번호를 입력 받아서          
           num = Integer.parseInt(str);
          
           cstmt.setInt(1, num);        // 넣고
           cstmt.registerOutParameter(2, Types.CHAR);   // 결과를 어떤 형식으로 받을 것인가.
          
           cstmt.execute();
          
           int salary = cstmt.getInt(2);   // 결과를 받는다.
          
           System.out.println(salary);
           System.out.println("End");
          
           cstmt.close();
           conn.close();
           mgr.freeConnection(conn);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


CallableStatement는 PreparedStatement를 상속받은 인터페이스로 DB에 저장된 Stored Procedure를 수행하는데 활용된다.
설정은 PreparedStatement와 동일하게 ?, ?, ? 로 설정을 하고 이후에 setXXX 메소드로 설정 할 수 있다.
실행한 결과를 받아 올때는 out 파라미터 등록 메소드인 registerOutParameter()로 등록을 해야만

실행 후에 getXXX 메소드로 결과를 추출할 수 있다.
conn.prepareCall(“{cal test1}”);
conn.prepareCall(“{call test2(?,?)}”);
conn.prepareCall(“{? = call test2(?,?)}”);

'프로그래밍 > DB' 카테고리의 다른 글

오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27

[펌] PL/SQL 05

프로그래밍/DB 2007. 11. 27. 14:11 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26878643

 

1. 개요
  - 작업을 수행하는 명명된 PL/SQL블록.
  - 반복실행을 위한 DB 객체로서 DB에 저장.
  - 매개변수를 가질 수 있고 호출될 수 있음.
  - 머리말, 선언부, 실행부, 예외처리부로 구성.
  - 재이용성, 유지가능성을 높여줌

 

2. 구문
  Create [Or Replace] Procedure procedure_name
  (argument1 [mode1] datatype1,
   argument2 [mode2] datetype2, …)
   Is | As

   Begin

   [Exception]

   End [procedure_name];

 

   procedure_name 프로시저의 이름
   Argument   전달 인수 명
   Mode        인수의 유형
     IN(default)  input argument
     OUT          output argument
     INOUT        input/output argument
   Datatype   인수의 데이터 타입

 

3. SQL*PLUS 이용 프로시저 생성
  - 스크립트 파일 생성
    : Sql> ed[it] 파일명.sql
  - 프로시저 스크립트 생성 후 스크립트 파일 저장.
  - 프로시저 생성 및 컴파일
    : Sql> @파일명 또는 start 파일명
  - 컴파일 오류 발생시 오류 확인
    : Sql> show error [Procedure 프로시저명]
  - 프로시저 실행
    : Sql> execute 프로시저명(인수명)

 

4. 프로시저 생성 예
  SQL> ed raise_salary.sql

  Create Or Replace Procedure raise_salary
  (v_id in emp.empno%TYPE)
  IS
  Begin
     update emp
          set sal = sal * 1.10
     where empno = v_id;
  End raise_salary;
  /

 

  SQL>@raise_salary
  프로시저가 생성되었습니다.

 

  SQL> execute raise_salary(7369)
  PL/SQL 처리가 정상적으로 완료되었습니다

 

5. 매개변수 전달 방법
  - 다중의 매개변수를 가지는 프로시저에서 매개변수의 값을 지정하기 위한 위치(Positional), 명명(Named), 결합(Combination)의 방법을 이용할 수 있음.
  - 위치 : 선언된 매개변수의 순서로 값을 나열
  - 명명 : 특수구문(=>)을 이용하여 매개변수 이름과  짝을 이룸으로써 순서없이 값을 나열
  - 결합 : 위치, 명명의 나열방식으로 값을 나열

 

  Create Or Replace Procedure add_dept
  (v_deptno in dept.deptno%type,
   v_name   in dept.dname%type  default  'unknown',
   v_loc    in dept.loc%type  default  'unknown')
  IS
  Begin
     Insert into dept
       values (v_deptno, v_name, v_loc);
  End  add_dept;
  /

 

  Begin
    add_dept(41);
    add_dept(42, 'TRAINING','SEOUL'); 
    add_dept(v_loc=>'JEONJU', v_deptno=>43, v_name=>'EDUCATION');
    add_dept(44, v_loc=>'DALAS', v_name=>'PRODUCING');
  End;
  /

 

6. 프로시저 삭제
  - SQL*PLUS를 사용하여 :
    Drop Procedure procedure_name
  - 프로시저 삭제 예 :
    Drop Procedure raise_salary;
  - 롤백은 Drop Procedure같은 데이터 정의 언어(DDL) 명령어 실행 후에는 불가능.

 

 

'프로그래밍 > DB' 카테고리의 다른 글

[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27

[펌] PL/SQL 04

프로그래밍/DB 2007. 11. 27. 14:11 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26877522

1. PL/SQL에서 SQL문장
  - SQL에 있는 DML, 트랜잭션 제어 명령 지원.
  - SELECT 명령어를 사용하여 database에서 한 행의 데이터를 추출.
  - 값은 단일 집합만 리턴될 수 있고 Into절을 이용하여 변수에 값을 할당.
  - DML 명령어를 사용하여 database의 다중 행에 대한 변경 가능.
  - COMMIT, ROLLBACK 명령어로 transaction을 제어함.
  - 암시적인 커서속성으로 DML 결과를 결정함.
    (SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND, SQL%ISOPEN)
  - PL/SQL은 DDL(CREATE, ALTER, DROP TABLE), DCL(GRANT, REVOKE)을 지원하지 않음.

 

2. PL/SQL에서 SELECT문장
  - Database에서 SELECT로 단일행의 data를 읽어들임.

  - SELECT  select_list
     INTO    {variable_name [, variable_name] | record_name}
    FROM    table
    WHERE   condition;

  - SQL의 SELECT 문장에 대한 모든 구문형식을 이용가능.
  - 호스트(바인드) 변수는 콜론으로 접두어를 붙여야 함.
    :v_variable_name

  - INTO절은 필수, SELECT절에서 SQL이 리턴하는 값을 저장하기 위한 변수의 이름을 지정.
  - SELECT절에서 선택된 각 항목당 하나의 변수를 INTO절에 지정해야 하며 순서도 일치.

  - 질의는 하나의 행만 리턴해야 하며 둘 또는 그 이상의 행 또는 행이 없이 리턴되면 에러 발생.
  - PL/SQL은 NO_DATA_FOUND 와 TOO_MANY_ROWS 예외로 블록의 예외 section에서 추적할 수 있는 표준 예외를 조성하여 이 에러를 처리할 수 있음.

 

  - TOO_MANY_ROWS 발생 예 :
  SQL> variable dept number
  SQL> variable salary number
  SQL> ed two_rows


  declare
     v_sum_sal  emp.sal%Type;
     v_deptno    emp.deptno%Type;
  Begin
     select deptno, sum(sal)
     into   v_deptno, v_sum_sal
     from   emp
     group by deptno;
     :salary := v_sum_sal;
     :dept   := v_deptno;
  End;
  /


  SQL>  @two_rows
  1행에 오류:
  ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
  ORA-06512: 줄 5에서

 

3. PL/SQL에서 데이터 검색위한 지침
  - Semicolon(;) 으로 개별 SQL 문장을 종료하기.
  - SELECT 문장이 PL/SQL 안에 내장될 때
    INTO절 사용.
    WHERE 절은 선택적.
  - SELECT 절에서의 column과 INTO절에서 출력변수의 수를 동일하게 선언해야 하고 위치상으로 대응되며, datatype은 일치해야 함.
  - 동적으로 %TYPE, %ROWTYPE 사용.
  - SUM같은 그룹함수는 SQL문장에서는 사용가능하지만 PL/SQL 구문에 사용 못함

 

4. PL/SQL에서 INSERT


  DECLARE
    v_empno emp.empno%TYPE;
  BEGIN
     SELECT  empno_sequence.NEXTVAL
     INTO v_empno
     FROM dual;

     INSERT INTO emp(empno, ename, job, depno)
     VALUES (v_empno, 'HARDING', 'CLERK', 10 );
  END ;
  /

 

5. PL/SQL에서 UPDATE


  DECLARE
     v_sal_increase emp.sal%TYPE  :=  2000 ;
  BEGIN
     UPDATE  emp
 SET  sal = sal  + v_sal_increase
       WHERE  job = 'ANALYST';
  END ;
  /

 

6. PL/SQL에서 DELETE


  DECLARE
     v_deptno  emp.deptno%TYPE  :=  10 ;
  BEGIN
     DELETE     FROM  emp
     WHERE              deptno = v_deptno ;
  END ;
  /

 

7. 암시적 커서
  - 암시적 커서의 속성을 이용하여, SQL 문장의 결과를 테스트할 수 있음. 
  - 암시적 커서 4가지 속성
     SQL%ROWCOUNT : 가장 최근의 SQL문장에 의해 영향을 받은 행의 수(정수값)
     SQL%FOUND    : 가장 최근의 SQL문장이 하나 또는 그 이상의 행에 영향을 미친 다면 BOOLEAN 속성은TRUE로 평가됨
     SQL%NOTFOUND : 가장 최근의 SQL문장이 어떤 행에도 영향을 미치지 않는다면 BOOLEAN속성은TRUE로 평가됨
     SQL%ISOPEN   : PL/SQL이 실행된 후에 즉시 암시적으로 커서를 닫으므로 항상 FALSE로 평가됨

  - 암시적 커서 사용 예 :
   SQL>VARIABLE  rows_deleted  Varchar2(100)


   DECLARE
     v_ordid  NUMBER := 605 ;
   BEGIN
     DELETE    FROM    item
     WHERE    ordid = v_ordid  ;

     :rows_deleted := SQL%ROWCOUNT ||' rows deleted.');
   END ;
   /

'프로그래밍 > DB' 카테고리의 다른 글

07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27

[펌] PL/SQL 03

프로그래밍/DB 2007. 11. 27. 14:10 Posted by galad

★ 실행문장 작성방법

출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26876947

1. 식별자(identifier)
    - 상수, 변수, 예외, 커서변수, 서브프로그램, 패키지를 포함하는 PL/SQL 프로그램 항목과 요소를 명명하기 위해 사용.
    - 30문자까지 가능.
    - Double quotation(" ")으로 둘러싸지 않으면 '예약어'를 식별자로 포함할 수 없음.
    - 반듯이 알파벳으로 시작.
    - 데이터베이스 테이블 column과 동일 이름을 가져서는 안됨.

 

    ※ 예약어 : 직접 그 문장의 뜻을 전달해 주는 의미와 용법이 정해져 있는 단어로써 예약어는 정해진 용도에만 사용해야 하며 사용자가 변경하거나 절차를 잘못 쓰면 안 된다.

 

2. 리터럴(literal)
    - 식별자로 표현되지 않은 명시적인 숫자, 문자, 문자열, 부울값.
    - 문자와 날짜 리터럴은 반드시 단일 인용 부호에 둘러 쌓여 있어야 함.
        v_ename := 'Henderson';
    - 숫자 리터럴은 단순값(33.5) 또는 과학적인 표기법(2E5, 2*10)에 의해 표현될 수 있음.
        v_degree := 33.5;
        v_value := 2E5;

 

3. 주석
    - 두개의 dash(--) : 단일 라인 주석.
    - 기호 /*와 */ 사이에 사이에 다중 라인 주석을 넣음.

 

4. PL/SQL에서 SQL함수의 사용
    - 사용 가능 : 단일 행 숫자, 단일 행 문자, 데이터형 변환(to_date, to_char, to_number), 날짜
    - 사용 불가 : DECODE, GREATEST, LEAST, GROUP functions(AVG, MIN, SUM…)

 

5. 중첩블록과 변수의 범위
    - 문장은 실행 명령이 허용되는 곳 어디에서든지 중첩될 수 있음.
    - 중첩 문장은 하나의 문장이 됨.
    - 예외처리부도 중첩 블록을 포함할 수 있음.
    - 객체범위는 객체를 참조할 수 있는 프로그램 영역임.

    - 내부 block은 둘러싸는(부모) block을 참조할 수 있음.
    - 외부 block은 둘러싸인(자식) block을 참조할 수 없음.
    - block은 형제 block을 참조할 수 없음.

'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 06 PL/SQL  (0) 2007.11.27

[펌] PL/SQL 02

프로그래밍/DB 2007. 11. 27. 14:07 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26849453

1. 선언

    identifier  [constant]  datatype  [not null] [ := | Default expr ] ;

    EX> v_hiredate  DATE;
           v_deptno    NUMBER(2)   NOT NULL := 10;
           v_location  VARCHAR2(13) := ‘Atlanta’;
           v_comm     CONSTANT  NUMBER  := 1400;
  

  설명

    identifier   : 변수명
    Constant  : 상수(변경불가). 상수는 초기화 필수.
    datatype   : 데이터 타입(date, number, varchar2…)
    Not Null    : 변수제약. Not Null 변수는 초기화 필수.
    expr        : 표현식(리터럴, 다른 변수, 연산자나 함수를 포함하는 표현식)


  주의

    두 변수는 서로 다른 block 에서라면 동일 이름을 가질 수 있고, 변수명은 block에서 사용 된 테이블 column의 이름과 같아서는 않된다.


2. 변수에 값 지정하기

    idenfier  := expr ;


    EX> v_empno := 7369;

           v_name := 'SMITH';

           v_limitdate := Sysdate + 7;

 

3. %TYPE을 이용한 변수 선언
   : 변수의 데이터형과 정밀도를 직접 선언하지 않고 이미 선언된 변수나 데이터베이스의 열에 맞추어 선언할 수 있음.
   데이터베이스 수준에서 열 데이터형이 변경되더라도 PL/SQL은 수정할 필요없음.

 

    identifier  tablename.columnname%Type;
    identifier  defined identifier%Type;

 

    identifier : 변수명.
    tablename : 참조하고자 하는 테이블명.
    columnname : 참조하고자 하는 필드명.
    defined identifier : 이미 선언된 변수명.

 

4. %ROWTYPE을 이용한 변수 선언
    정의할 변수가 특정 테이블, 뷰의 모든 컬럼을 대상으로 선언해야 할 경우 테이블, 뷰의 모든 컬럼의 데이터형, 크기, 속성등을 그대로 사용할 수 있음.
    EX> v_emp    emp%ROWTYPE;
       
5. 바인드 변수 : Host 환경에서 PL/SQL에게 값을 전달하거나 전달받기위해 선언된 변수.

    VAR[IABLE] 변수명  [ NUMBER | CHAR(n) | VARCHAR2(n)]


    EX> variable ret_code number

    PL/SQL에서, bind variable을 참조하기 위해 콜론(:)을 변수명의 접두어로 붙임.
    EX>
    ...
    Begin
      Select sal Into v_sal
      From   emp
      Where  empno = 7369;
      :salary := v_sal;
    ...

 

6. 치환변수 : 입력 프롬프트에서 블록 내부로 직접 값을 전달하는 변수
    SQL>Set Verify Off
    SQL>Accept 변수명  Prompt ‘값을 등록하세요: ’

    PL/SQL 블록 내부에서 치환변수 사용시 &변수명 사용
    EX> v_name   varchar2(20) := &p_name;

 

    ※ SET VERIFY ON/OFF : &를 이용한 치환 변수를 사용할 때 치환되기 전/후의 자세한 값을 보일것인지의 여부를 결정 한다. 기본값은 ON 이다.

'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27

[Oracle/펌] PL/SQL 01

프로그래밍/DB 2007. 11. 27. 14:06 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26651797

◈ 개요.

PL/SQL (Oracle’s Procedural Language extension to SQL) 은 SQL의 확장된 개념으로 ORACLE에서 지원하는 프로그래밍 언어의 특성을 수용한 SQL의 확장이며, PL/SQL Block내에서 SQL의 DML(데이터 조작어)문과 Query(검색어)문, 절차형 언어(if, loop)등을 사용하여 절차적 프로그래밍을 가능하게 한 강력한 트랜잭션 언어이다.
 
PL/SQL 문은 블록구조로 이루어지며 PL/SQL 자신이  컴파일 엔진을 포함하고 있다.

 

◈ 장점.

PL/SQL 문은 BLOCK 구조로 다수의 SQL 문을 한번에 ORACLE DB 로 보내서 처리하므로 수행 속도를 향상 시킬수 있다.
PL/SQL 의 모든 요소는 하나 또는 두개 이상의 블록으로 구성하여 모듈화가 가능하다.
보다 강력한 프로그램을 작성하기 위해서 큰 블록안에 소블럭을 위치시킬 수 있다.
Variable, Constant, Cursor, Exception을 정의하고, SQL문장과 Procedural 문장에서 사용한다.
단순, 복잡한 데이터 형태의 변수를 선언한다.
테이블의 데이터 구조와 DataBase의 컬럼에 준하여 동적으로 변수를 선언 할 수 있다.
Exception 처리 루틴을 이용하여 Oracle Server Error를 처리 할 수 있다.
사용자 정의 에러를 선언하고 Exception 처리 루틴으로 처리 할 수 있다.

 

◈ 구조.

PL/SQL은 논리적인 블록으로 이루어진 구조화된 블록언어로써 세개의 섹션으로 구성된다.

 -. 선언부.

 -. 실행부.

 -. 예외처리부.

 

1. 선언부

 Declare 문으로 시작하며 블록에서 사용될 변수, 상수, 커서, 예외를 선언하는 섹션으로 필요하지 않으면 생략할 수 있는 선택적 섹션이다.

     - 변수선언

     - 상수선언

     - 커서선언

     - Exception선언

 

2. 실행부

 Begin 문으로 시작하여 End; 문으로 종료하며 수행될 작업의 몸체이다.

 SQL문, 제어문, 반복문, 커서속성 등을 이용하여 블록에서 실행할 몸체를 구성할 수 있으며 생략할 수 없는 필수적 섹션이다.

     - Select / Update, Insert, Delete

     - IF문

     - Loop문

     - 커서속성

 

3. 예외처리부

 예외처리 섹션은 End; 문 바로 앞에 위치하며 미리정의된 예외를 추적하고 명시된 조건이 발생할 경우에 취할 작업을 정의하고 선택적 섹션이다.

     - 미리정의된 예외

     - 사용자정의 예외

     - Exception 함수(sqlcode, sqlerrm)

 

Declare, Begin, Exception 문은 세미콜론(;)이 붙어서는 않되지만, End 문과 모든 PL/SQL 문장은 줄의 마지막에 세미콜론을 반드시 붙여야 한다.

 

PL/SQL종류 

1. 익명(이름없는) Procedure

   이름없이 사용되는 PL/SQL 블록.
   DB에 저장되지 않고 사용자가 필요할 때마다 반복적으로 작성, 실행.
2. 2. Stored Procedure
   생성이후 DB에 정보가 저장됨.
   실행하려는 로직을 처리하고 PL/SQL블록의 흐름제어.
   인자를 받아서 호출되고 실행.
3. 3. Stored Function
   프로시저와 동일한 개념, 기능이나 처리결과를 사용자에게 리턴.
4. 4. Package
   특정업무에 사용되는 프로시저 또는 함수를 묶어 생성하여 관리.
5. 5. Trigger
   테이블 생성시 지정.
   지정된 이벤트 발생시 자동적으로 호출되어 실행되는 특수한 형태의 프로시저.
   DB의 감시, 보안, 연속적 오퍼레이션의 자동처리 구현
 

'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27
[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27

[JDBC] 06 PL/SQL

프로그래밍/DB 2007. 11. 27. 14:05 Posted by galad

★ PL/SQL 간단 예제

SQL> ed an_1             // an_1.sql을 생성해서 간단한 PL/SQL문을 작성한다.


// 넘버 2개를 입력받아 첫번째 넘버에 해당하는 데이터의 age를 2배하여

// 두번째 넘버에 해당하는 데이터의 age에 넣는다.


accept a_one_num prompt '검색할 넘버는? '
accept a_two_num prompt '갱신할 넘버는? '

declare
   v_one_age NUMBER;    // 변수 이름이 먼저 온다. ㅡ.ㅡ;;
begin
   select age into v_one_age from test10_tbl where num = &a_one_num;
   update test10_tbl set age = (2 * v_one_age ) where num = &a_two_num;
end;


!!! 주의

첫번째 넘버로 검색했을 때, 데이터가 여러개가 나오면 에러 발생

"실제 인출은 요구된 것보다 많은 수의 행을 추출합니다"

-> 루프문으로 해결해야 한다.


★ 간단 예제2

SQL> ed an_2             // an_2.sql을 생성해서 간단한 PL/SQL문을 작성한다.


set echo off   // 에코 없애기
set verify off   // 마찬가지


accept a_sal prompt '얼마 원해?'
variable v_result varchar2(40);


declare
   v_sal number := &a_sal;
begin
   if(v_sal > 500) then
      :v_result := '진짜야? 짤리고 싶어?';
   elsif(v_sal > 300) then                      // else if 가 아니다 ㅡ.ㅡ;;
      :v_result := '그래? 일 열심히 했어?';
   else
      :v_result := '그거 가지고 괜찮아?';
   end if;
end;
/


print v_result   // 결과 출력


set verify on
set echo on



★ 프로시져 간단 예제

- empno를 입력받아 그 사람의 sal을 a_sal 로 돌려준다.


create or replace procedure proc1(a_empno in number, a_sal out number)
is
begin
   select sal into a_sal from emp where empno = a_empno;
end;
/


show errors   // 오류가 있나 체크



// 오라클 서버에 저장이 되어서 나중에 간단하게 실행시킬 수 있다.


SQL> variable v_salary number;      // 변수 선언?? - 결과값을 받는다.
SQL> exec proc1(7566, :v_salary);  // 프로시져 실행


PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> print v_salary;   // 결과값 출력


  V_SALARY
----------
      2975


'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27