database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Tutorials 11299 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 11299
Oracle 기초강좌 (4)
작성자
정재익(advance)
작성일
2002-07-11 10:55
조회수
30,166

[Data Type]Char와 VarChar2 Type의 비교분석

 

A. CHAR

- 고정 길이 문자열을 저장한다. 사용자가 고정길이 보다 짧은 값을 저장하면 나머지 공간은 Space로 체원진다.

- 1~255까지의 문자를 저장.

- 사용자가 후행 공백을 포함하여 고정길이 보다 큰 값을 입력하면 고정 길이에 맞게 값에서 공백이 잘린다.

- 값이 너무크면 Oracle Error발생

- 공백채움비교(blank-padded comparison semantics)를 사용한다.[비교문자열 둘다가 CHAR인경우]

a. 비교하는 두변수의 값이 길이가 다른 경우 짧은쪽을 공백으로 채운다는 것을 의미함

 

예) ‘a ‘ = ‘a’(우측의 갑은 1 Byte이므로 1 Byte를 공백으로 채워 2 Byte를 만든후 비교한다.)

 

- 데이타의 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘어 확정된 크기에 대한 사용 비율이 높은 고정 길이인 경우 사용된다. 예를 들면 사번, 각 바이트가 의미가 있는 코드 등에 사용된다.

 

- 가변 길이로 지정할 경우 사이즈 증가로 인한 많은 체인 발생이 우려되는 경우

- 초기에는 데이타가 입력 되어 있지 않지만 일정 시간이 지나면 데이타가 입력 되어 지는 경우

- 오라클에서 권장하기는 CHAR보다는 VARCHAR2을 사용하는 것이 효과적임

 

B. VARCHAR2

- 가변길이 문자열을 저장한다. 1 ~2000 Byte 저장가능함.

- 최대 50자를 저장할수 있는 VARCHAR2 TYpe의변수에 10자를 저장한다면 실제 저장공간에 10자만을 저장한다.

- 공백채우지 않음 비교(non-padded comparison semantics)를 사용한다.[비교값 둘다 또는 한쪽 이라도 VARCHAR2 Type인 경우]

 

예)’a ‘ > ‘a’(우측의 값이 길이가 짧아도 공백으로 채우지 않으니까 왼쪽의 값이 큰 것은 당근)

 

- 처음 테이블 생성시 해당 블럭에 데이타 증분치를 고려하여 PCTFREE(디폴트 10)라는 파라메터를 지정하게 되는데 데이타 증분이 많이 발생하게 되면 이영역이 모두 소모 되어 체인이 발생하여 원하는 로우를 검색하고자 할때 필요없는 I/O를 발생 시킨다. 하지만 대개 테이블을 생성하게 되는 개발자는 테이블의 증분 가능성및 수치에 대해 예상하여 적절한 PCTFREE 값을 사전에 적절이 지정할 수 있을 뿐만 아니라, USER_TABLES라는 딕션널리 정보를 검색하여 발생한 체인 발생정도를 파악할 수 있다. 만일 심하게 체인이 발생할 경우 EXP/IMP 유틸리티를 이용하여 체인을 제거할 수 있으며 설령 약간의 체인이 존재할 경우라도 해당 테이블을 사용하는데 많은 제약이 되지 않는다. 또한 VARCHAR2 타입을 사용할때 DEFAULT라는 사용자 제약 조건에 의해 사전에 공간을 확보할 수 있다

- VARCHAR2 타입을 사용한다 할지라고 예견 못할 체인 발생에 대해 전혀 문제점이 없다는 것을 알수 있고, VARCHAR2 타입을 사용함으로서 보다 효과적으로 저장 공간을 이용할 수 있으며 이는 긍국적으로 수행 속도의 향상을 의미하게 된다.

 

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

적절한 문자 Data Type 선택방법

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

 

1. 비교의미 에서 ANSI 호환성이 필요한 경우 , 즉 후행공백이 중요하지 않으면 CHAR유형을 사용하고 중요하다면 VARCHAR2 Type을 사용한다.

 

2. 저장공간의 효율적 사용을 위해서는 VARCHAR2 Type을 사용한다.(char type 은 고정길이)

 

3.전체 테이블을 스캔할 경우 CHAR 형태로 저장된 테이블이 VARCHAR2 형태로 저장된 데이타 보다 많은 블럭 입출력을 발생시켜 속도가 느려질 수 있다. 반면 VARCHAR2 형태의 데이타가 증가 될때는 블럭 내 PCTFREE 영역을 사용하게 되고 만일 이 영역이 모자라는 경우 블럭 체인이 발생하여 원하는 데이타를 검색하고자 할 때 하나 이상의 블럭을 검색하게 되어 오히려 수행 속도에 악영향을 미칠 수 있다.

 

4.VARCHAR2 타입은 가능한 충분히 최대치를 부여하는 것이 효과적이다. 왜냐하면 실지 크기만 저장되지 컬럼 선언시 지정한 사이즈가 실지로 내부 블럭에 저장되지 않는다 따라서 되도록 큰 사이즈를 지정함으로서 길이 부족으로 인한 에러는 방지 할 수 있다. 흔히 현업에서 성명 타입의 사이즈를 결정할때 8 바이트 10바이트 12 바이트등 여러가지 논란이 있어 왔으나 오라클을 사용하는 경우 VARCHAR2 타입으로 넉넉히 확정하더라도 공간이용 측면에서 전혀 불이익이 없이 가변적인 성명(외국인 성명 포함) 길이를 수용할 수 있다.

 

5.CHAR 타입은 한 바이트라도 값이 들어간다면 지정된 크기 만큼 내부적으로 크기가 확정됨므로 가능한한 최소 길이로 확정하는 것이 효과적이다. 충분히 해당 크기를 예상할 수 있는 컬럼, 즉 사번, 코드 등등 확정된 컬럼에만 지정하는 것이 효과적이다. 만일 매우 가변적인(컬럼내에 입력되는 데이타의 길이 편차가 클때) 경우 필요없는 공간 낭비를 가져올 수 있다는 사실을 명심해야 한다.

 

 

[Data Type]Number Data Type에 관해

 

========================

Number Data Type

========================

 

1. 고정숫자와 부동 소수점 숫자를 저장한다.

 

2. Oracle을 작동하는 서로 다른 시스템간에 38자 까지 정밀도를 유지하며 호환가능

 

3. 최대 38자리의 유효숫자를 가지는 양수/음수,0 등이 저장된다.

 

4. Column_name Number;Column_name Number(precision, scale)등의 형식으로 선언한다.

- Scale을 지정하지 않으면 0

- precision에 ‘*’를 표시하면 38

- 숫자필드를 지정할 때 정밀도와 Scale을 지정하는것이 좋음

- 7,456,123.89의 숫자가 있을 때 number로 선언하면 7456123.89로 저장

- 7,456,123.89의 숫자가 있을 때 number(*,1)로 선언하면 7456123.9로 저장

- 7,456,123.89의 숫자가 있을 때 number(9)로 선언하면 7456124로 저장

- 7,456,123.89의 숫자가 있을 때 number(9,2)로 선언하면 7456123.89로 저장

- 7,456,123.89의 숫자가 있을 때 number(6)로 선언하면 오류

 

5. Number형의 Column길이 계산방법

- Oracle은 numeric data를 가변 길이 포맷으로 저장한다. 각 값은 scientific notation으로 저장된다.(1 byte used to store exponent and up to 20 bytes to store mantissa) Oracle은 앞뒤의 0을 저장하지 않는다.

- 즉 1 Byte는 지수를 저장하며, 최대 20 Byte가 가수를 저장하는데 사용된다.(정밀도는 최대 38) 또한 선행하는 0이나,후행하는 0은 저장하지 않는다. 예를들면 숫자 412는 4.12 * 10^2과 유사한 형식으로 저장된다.

 

즉 1 Byte가 지수2를 저장하는데 사용되며, 2 Byte가 가수 (4,1,2)를 저장하는데 사용 된다.

 

이를 이용하여 Number(p)에 대한 Column의 Byte계산이 가능하다.

1 Byte(지수) + floor(p/2) + 1 Byte(가수) + 1 Byte(음수)

 

6. 정수부분과 소수부분을 구분하는 소수점문자(.)를 변경할려면

NLS_NUMERIC_CHARACTERS Parameter를 변경해야 한다.

 

7.특히 주의할 사항은 소수점 이하는 반올림되어 저장된다는 사실을 감안하여 수치 연산이 많은 경우 이를 고려하여 소숫점이하 크기를 결정하여야 한다.

 

8.오라클에서는 원래의 데이타를 다른 타입의 데이타로 바꾸기위해 아래와 같은 여러가지 함수를 제공한다. TO_NUMBER(), TO_CHAR(), TO_DATE(), HEXTORAW(), RAWTOHEX(), ROWIDTOCHAR(), CHARTOROWID()을 이용하여 명시적으로 데이타 타입을 변경을 할 수 있을 뿐 아니라 값 지정(assignment)시 오라클은 자동적으로 변환 작업을 수행하고, 문장(expression) 내에서도 자동적으로 연산을 수행하기 위해 타입 변환을 수행한다.

 

9.숫자 타입과 문자 타입의 값과 비교되면 상대 타입을 숫자 타입으로 바꾸어 비교된다. 예를 들어 NUM1이 NUMBER 타입이고 인덱스가 생성되어 있을때 아래의 쿼리문을 수행하게 되면

SELECT * FROM TABLE1 WHERE NUM1 = '123';

일 경우 내부적으로 위의 문장은 문자 타입의 변환이 발생함으로 위의 문장은 아래와 같이 변동되어 처리 된다.

SELECT * FROM TABLE1 WHERE NUM1 = TO_NUMBER('123');

로 변동 되어 처리 되므로 인덱스를 사용하게 된다.

 

10.NUMBER 타입으로 지정된 컬럼을 LIKE 'char%'로 비교하면 인덱스를 사용하지 않으므로 주의 하여야 한다.

 

SELECT * FROM TABLE1 WHERE NUM1 LIKE '1%';

 

을 수행하게 되면 일단 숫자 타입을 기준으로 '1%'을 바꾸려고 하지만 LIKE문으로 인해 숫자 타입으로 변경할 수 가없다. 따라서 NUM1이 문자 타입으로 변경된다.

즉, 내부적으로

 

SELECT * FROM TABLE1 WHERE TO_CHAR(NUM1) LIKE '1%';

 

로 변형이 일어나 수행하게 되므로서 수행 속도 향상에 주요한 인자가 되는 인덱스를 사용할 수 없게 된다. 따라서 가능한한 인덱스를 생성할 컬럼은 문자 타입이 효과적이다.

 

 

[Data Type]Long Type에 관하여

 

--------

Long

--------

1. 최대 2G Byte의 정보를 포함하는 가변길이 문자열

2. Long및 Long Raw Data이용시 제한사항

- Table당 하나의 Long Column만 허용

- Long Column은 Index 될수 없다.

- Long Column은 무결성 제약조건(Constraints)에 나타날수 없다.

- Where, Group By, Order By, Connect By,정또는 SELECT의 Distinct Operator등에 사용할수 없다.

- Long Column은 substr, instr같은 SQL Function에서 참조될수 없다.

- 하위질의를 지닌 SELECT목록이나 Union, Union all,Intersect또는 Minus등에 사용될수 없다.

- Create table … as select,,,등을 이용하여 Table을 생성할때나 insert into … select

…등의 표현에 참조될수 없다.

- Trigger변수는 Long oe Long raw Type을 사용할수 없다.

 

-예를 들면 뷰에 대한 정보를 저장하고 있는 USER_VIEWS에는 TEXT라는 LONG 컬럼이 존재한다. 이를 조회 하기 위해

SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = 'EMP_V'

을 쿼리하면 된다. 이때 주의할 사항은 환경 변수중 LONG을 위한 출력 크기이다. 디폴트는 80이므로 1 라인 이상 출력 되지 않는다. 이를 늘려주기위헤 SET LONG 1000등의 명령어를 SQL 상태에서 입력하여 환경을 변경 시키면된다

 

 

[Data Type]Date Type에 관하여

 

----------

Date

----------

1. 날자를 가르키는 값을 Tanle에 저장. 세기를 포함하여 년,월,일시,분,초,등을 저장한다.

 

2. BC 4712년1월1일부터 AD 4712년 12월31일까지의 날자형식을 저장할수 있다.

 

3. 7 Byte의 고정길이 Column임.

 

4. Oracle의 기본날자 형식은 dd-mon-yy, NLS_DATE_FORMAT Parameter를 이용하여 기본형식을 변경할수 있다. 또는 Alter Session Command를 이용하여 해당 sssion기간동안 날자형식을 변경할수도 있다.

 

5. 표준 Oracle날자 형식이 아닌 형식의 입력을 위해서는 to_date 함수를 이용한다. to_date(‘november 13, 1992’,’month dd, yyyy’)

 

6. Oracle에서 시간은 24시간 형식(HH:MI:SS)으로 저장한다. 기본적으로 날자 Column의 시간을 입력하지 않은 경우 12:00:00 AM(자정)으로 저장된다. 만약 시간만 입력되면 해당월의 1일이 입력된다. Date의 time부분을 입력하려면 반드시 TO_DATE함수와 format mask를 이용해야 한다.

 

7.기본적으로 일자나 연산이 빈번히 경우 DATE 타입으로 가져가는 것이 효과적일 수 있지만 시간이 정상적으로 입력된 경우 일자를 '=' 연산으로 비교할 수가 없다. 예를 들면 아래와 같다.

 

INSERT INTO EMP (EMPNO,ENAME,HIREDATE,DEPTNO)

VALUES (7777,'BJKIM',TO_DATE('94/03/15 03:20:30','YY/MM/DD HH:MI:SS');

 

와 같이 정상적으로 날짜를 입력한후

 

SELECT * FROM EMP WHERE HIREDATE = '15-MAR-94';

 

을 수행 하더라도 원하는 결과를 도출할 수 없다. 뿐만 아니라 LIKE, SUBSTR등의 함수를 이용하여 스트링(string) 비교를 하고자 할때 제한적으로 밖에 사용할 수 없다. 즉 디폴트 날짜 형태를 기준으로만 비교 가능하다.

 

예 ) 81년에 입사한 인원을 찾고자 할때

 

a.SELECT * FROM EMP WHERE HIREDATE LIKE '%81';

혹은

b.SELECT * FROM EMP WHERE SUBSTR(HIREDATE,8,2) = '81';

 

와 같이 SQL문을 날짜 타입의 기본 형태인 'DD-MON-YY'을 기준으로 스트링 함수를 사용하여야 한다.

 

예 ) 만일 HIREDATE에 인덱스가 생성 되어 있을때 아래 2가지 SQL문을 수행하게 되면 a의 경우는 인덱스를 사용하지만 b의 경우에는 인덱스를 사용 못하는 일반적인 문자 타입과의 차이점을 보인다.

 

SELECT * FROM EMP

WHERE HIREDATE1 = '01-MAR-81';

 

SELECT * FROM EMP

WHERE HIREDATE1 BETWEEN '01-JAN-81' AND '31-DEC-81';

 

의 경우는 내부적으로 비교되는 값에서 투데이트 함수를 이용하여 처리를 하지만 의 경우 컬럼 부분이 TO_CHAR을 이용하여 변동되기 때문에 인덱스를 사용할 수 없다.이와 같은 사항을 주의하여 쿼리문을 수행하여야 한다. 결론적으로 자주 조건절에 사용되거나, 데이트 연산 기록(logging), 타임 스탬프로 사용되는 컬럼을 제외하고는 효과적인 수행을 위해 문자 타입 적용을 고려하는 것이 효과적이다.

 

 

[Data Type]Raw/Long Raw Type에 관하여...

 

1. 이진 Data또는 Byte문자열을 위한것

 

2. RAW및 LONG RAW는 Data전송시 인스턴스에 사용자 세션을 접속하는 SQL*Net과 Inport/Export Utility가 문자변환을 수행하지 않는다는 점을 제외하면 Varchar2 Data Type과 같은 가변길이 Data 유형이다.

 

3. Oracle이 RAW나 LONG RAW를 CHAR로 상호 변환하는 경우 한 문자에 4bit가 해당되는 16진수 형태로 표현된다.(11001011 은 'CB')

 

4. Long Raw는 Index될수 없으나 Raw는 Index 될수있다.

 

 

[SQL*NET]SQL*Net이란...

 

A. SQL*Net은 network workstation과 server들에서 운영되는 Oracle tool들이 다른 server 들에 있는 data를 access, 수정, 공유, 그리고 저장하는 Oracle network interface이다.

 

SQL*Net은 distributed database과 distributed processing을 위해 communication protocol과 광범위한 network에 의해 지원되는 API(Application Programmatic Interfaces)를 이용한다.

API는 network에서, communication protocol을 통해서 remote process-to-process communication 을 설정하기 위한 방법을 제공하는 subroutine들의 집합이다. Networked 환경에서, Oracle server는 SQL*Net을 사용하여 client workstation들과 다른 Oracle server들과 통신한다.

 

B. SQL*Net driver는 Oracle tool과 package의 interface로부터 SQL statement를 얻어 industry-standard higher protocol이나 programmatic interface를 통해 Oracle로 전송한다. Driver는 Oracle과 package로부터 SQL statement를 받아 동일한 상위 level의 communication mechanism을 이용하여 tool로 전송한다. 이것은 모두 NOS(Network Operating System)와 독립적으로 수행된다.

 

SQL*NET의 Definition

 

SQL*NET V2란 Oracle사의 원격 database access software로서 TNS (Transparent Network Substrate) 기술을 사용하여 CLIENT/SERVER , SERVER/SERVER 간에 communication할 수 있도록 도와 준다. 즉 다른 computer(Client이든 Server이든) 상 에 위치한 application은 SQL*NET의 TNS network를 통해 다른 server상의 database와 연결할 수 있도록 도와준다.

 

SQL*NET의 V2의 Benefit

1. SQL*NET은 Local Database에서 다른 Remote Node의 Database와 연결하여 Data를 Access할 수 있는 Database Link를 가능하게 한다.

2. SQL*NET은 Protocol과는 독립적이다. 즉 어떤 특정 Protocol을 사용하는 Computer에서 돌아가는 Application은 다른 종류의 Protocol을 사용하는 Remote Computer의 Database와도 연결이 가능하다.

3. 이질적인 네트워킹(Heterogeneous Networking)이 가능하다. 즉, 같은 Protocol을 사용하는 Machine의 Group을 하나의 Community라 부르며 이러한 다른 Community간에도 Network이 가능하다. 이는 Protocol을 변환시켜주는 Multi protocol Interchanger가 수행하고 이는 별도의 Install을 요한다.

 

 

[Data Integrity]Data Integrity(무결성)의 정의

 

==========================

Types of Data Integrity

==========================

 

A. Nulls

- 기본적으로 Column은 Null을 허용한다.

Column에 대해서 null을 포함하는 row들의 insert나 또는 update를 허용하는 또는 허용하지 않는 하나의 column에 대해서 정 의되는 규칙.

 

B. Unique Column Values

-Column(또는 column들의 집합)에 대해서 unique value를 포함하는 row들의 insert나 또는 update만을 허용하는 column들(또는 column들의 집합)에 대해서 정의되는 규칙, 즉 지정된 열또는 열들에서중복된 값을 허용안함

 

- Unique 제약조건을 구성하는 열중 일부분이 Null을 허용한다면 Null을 허용하지 않는 열은 동일한 값을 가질수 없다.

 

C. Primary Key Values

-Table에 있는 각 row는 column(또는 column들의 집합)에 있는 value들에 의해서 유일하게 식별될 수 있도록 하는 하나의 column(또는 column들의 집합)에 정의된 규칙.

 

- Primary Key Column은 Null을 허용하지 않는다.

 

- 만약 dept Table의 dept_no Column이 Primary Key라면 해당열에 대한 고유 인덱스를 암시적으로 생성하며 해당열에대해 not null제약조건을 암시적으로 생성한다.

 

- Primary Key Column은 16개 까지로 제한됨

 

D. Referential Integrity(참조 무결성)과 Foreign Key 무결성 제약조건

- 만약 Column 또는 column들의 집합에 대한 값(the dependent value)이 관련된 table의 column에 있는 값(the referenced value)과 match 된다면 하나의 row에 대한 insert 또는 update만을 허용하는 하나의 table에 존재하는 column(또는 column들의 집합)에 대해서 정의된 규칙.

 

-Referential integrity는 또한 어떤 data 조작의 유형이 참조되는 값들에 허용되는 지와 이러한 action들이 종속된 값들에 어떠한 영향을 주는 지를 지시하는 규칙들을 포함한다.

 

Restrict

 참조되는 data의 update 또는 deletion을 허용하지 않는 referential

integrity.

 

Set to Null

 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 NUll이 설정된다.

 

Set to Default

 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 default value가 설정된다.

 

Cascade

 참조되는 data가 update될 때, 관련되는 모든 종속된 data도 update된다; 참조되는 row가 delete될 때, 관련되는 모든 종속된 row들도 delete된다.

 

F. Check Constrints

- 각 열또는 열집합에 대한 Check Constraints는 지정된 조건이 참인지 거짓인지 알수있게 한다.

 

- 사용자가 확인 조건을 지정함으로서 특수하거나 복잡한 무결성 조건을 시행한다.

 

- 문자열 리터럴이나 인수(투캐랙터, 투넘버, 투데이트)로 NLS 매개변수를 가지는 SQL을 포함한는 제약조건을 평가하기 위해 Oracle은 기본적으로 DataBase의 NLS설정값을 사용한다.

[Top]
No.
제목
작성자
작성일
조회
11303Oracle 기초강좌 (7)
정재익
2002-07-11
21089
11302Oracle 기초강좌 (6)
정재익
2002-07-11
24019
11300Oracle 기초강좌 (5)
정재익
2002-07-11
21300
11299Oracle 기초강좌 (4)
정재익
2002-07-11
30166
11298Oracle 기초강좌 (3)
정재익
2002-07-11
20633
11297Oracle 기초강좌 (2)
정재익
2002-07-11
24146
11296Oracle 기초강좌 (1)
정재익
2002-07-11
25139
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.054초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다