2015-11-26

대용량 데이터 베이스 솔루션 I - 데이터 타입및 길이의 결정

대용량 데이터 베이스 솔루션 I                                                 
                                                               
                                                                                                           

Ch 3. 데이터 타입및 길이의 결정                                                                                                            

  > 서로 관계를 가지는 컬럼들은 킬이와 타입이 같아야 한다.                                                                                                         
  1. 데이타 타입의 선정 절차.                                                                                                         
     > 문자 타입,숫자 타입의 결정                                                                                                      
        >> 예를들어 'A0001'과 같이뒤의 숫자가단순 증가인경우는 쓸데없이자릿수 채우기로 '0001' 부여하는것은 좋지 않다 차라리, 문자와 숫자를 별도의                                                                                                    
           컬럼으로 분리하는것이 효울이 좋다.                              <<단 각 자리수가 각기다른 의미를 가진다면 예외로한다.                                                                  
     > 문자 타입의 확정                                                                                                       
        >>데이터 타입의결정                                                                                                   
           1. 먼저 일반 문자 타입인지, 특수형태인지 결정한다.                                                                                                
           2. 일반 문자 타입으로 하면, 고정길이(CHAR)인지 가변길이(VARCHAR2)인지 결정한다.                                                                                                
           3. 데이터에서 나올수 있는 최대 길이를 조사,결정한다.                                                                                                
           4. 최대가2000바이트가 넘는다면 LONG 타입을 사용할지 VARCHAR2를 여러 개 사용할지 결정한다.                                                                                                
           5. 음성이나 영상일경우를 결정한다.                                                                                                
     >숫자 타입의 확정                                                                                                      
        >>  숫자라고 꼭 숫자 타입으로 해야할 필요는 없다.                                                                                                   
           1. 문자티입으로할 필요성에대해 조사한다,(주로 향후에 인덱스로 구성될인조키에 해당하는 컬럼이나 구분코드등)                                                                                                
           2. 숫자타입으로 결정 했다면 최대 길이를 조사하여 결정한다. (숫자타입은고정길이가아니다, 숫자의 길이를 2로 나는 길이에 부호 관리를 위해                                                                                                 
              1바이트가 결합된 가변길이로 저장된다.)                                                                                             
           3. 소수점을 몇자리까지 할것인지 결정한다.                                                                                                
           4. 만약 년월일(YYYYMMDD)gudxofh 관리 하고자 하는 숫자 컬럼은 문자타입으로 하는것이 유리하다                                                                                                
     > 날짜 타입의 확정                                                                                                      
        >> 자유로운 연산이 가능한 DATE 타입이 존재한다.                                                                                                   
           단 날짜라고 DATEAKS  고집하면 득보다 실이 많으므로 신중히 결정한다.                                                                                                
  2. 데이터 타입의 선정                                                                                                         
     > CHAR 타입                                                                                                       
        >> 고정 길이 문자타입으로 255까지 입력가능하며 모자라면 공백으로채우지만 , 아예 아무것도 입력되지 않으면 null 으로 설정된다.                                                                                                   
        >> 고정길이타입은 별도의 내부 컬럼을 가지므로 저장공간을 절약할수없다, 수행속도 향상도 이루어지지 않을경우가 더 많다                                                                                                    
        >> 다음과 같은 경우에 사용한다.                                                                                                   
           1. 저장되는 모든 데이터가 고정길이를 가지는 경우에 사용한다.(DB설계자 간의 확실한 사전 약속의 선행 요구 타입의 일관성유지를 위해)                                                                                                
           2. 저장되는 모든 데이터가 일정한 길이 이상을 가지며 컬럼의 길이가 길지 않은 겨우는 CHAR 타입의 사용을 고려해 본다.                                                                                                
              >>> 사실은 고정길이가 다 채워지지 않은 컬럼을 비교하는것이 어렵기 때문에 좋지 않다 ,그러므로 반드시 고정된 열수를 가지고 항상                                                                                             
                 그만큼이 모두 입력되는 걸로 예상되는 컬럼에 사용하는 것이 좋다,                                                                                          
           3. 컬럼의 길이가 한자리인 경우에 사용한다.                                                                                                
              >>> 컬럼의 길이가 한자리이므로 컬럼비교에서문제가발생안한다                                                                                             
           4. 가변길이로 사용되는 경우 많은 체인이 발생될것으로 예상되는 경우에 사용한다.                                                                                                
              >>>  이경우도 빈칸으로 채워지는 불용성 재고가 많아 지는 경우라면 네트워크에 불필요한 공백데이타가 흐르고 저장공간이 낭비되므로                                                                                             
                    전체적으로 수행속도가 저하되므로 차라리 VARCHAR2 로하고 PCTFREE를 늘리는 경우가 유리할수도 있다.                                                                                       
           5. 로우 생성시는 채워지지 않으나 , 곧 채워질것으로 예상되는 컬럼일 경우 사용을 고려한다.                                                                                                
              >>> VARCHAR2에서도 DEFAULT를 사용하여  미리 공간을 잡아 놓는 것이 가능하다.                                                                                             
                                                                                                           
     >VARCHAR2 타입                                                                                                       
        >> 가변길이 타입으로 최대 2000바이트로 반드시 초기길이를 지정해야한며,입력시 공백이 채워지지 않는다,                                                                                                   
           1. 저장되는 데이터가 가변길이를 가지는 경우에 사용한다.(특히열수가 틀리거나 null 값이 입력되는경우라면 반드시)                                                                                                
           2. 체인발생이 우려되면 PCTFREE 를 증가시킨다,                                                                                                
           3. 테이블을 통합했을때 기본키 값에 따라 컬럼 값이 존재하지 않을수있는 경우는 반드시 VARCHAR2를 사용한다.                                                                                                
           4. VARCHAR2 타입을 사용했을때 PCTFREE의 발생상태를 확인해준다.                                                                                                
                                                                                                           
  % PCTFREE의 증가 확인 쿼리                                                                                                          
     ALALYZE TABLE table_name COMPUTE STATISTICS;                                                                                                       
     SELECT CHAIN_CNT FROM USER_TABLES                                                                                                       
        WHERE TABLE_NAME = 'table_name';                                                                                                   
                                                                                                           
     ANALYZE TABLE table_name LIST CHAINED ROWS { INTO chained_table_name };                                                                                                      
     SELCT * FROM  chained_table_name;                                                                                                      
                                                                                                           
     저장할 chained_table_name dl 지정되지 않으면  CHAINED_ROWS 라는 시스템 테이블에 저장된다.                                                                                                      
                                                                                                           
     SELECT * FROm CHAINED_ROWS WHERE TABLE_NAME = ' table_name';                                                                                                      
                                                                                                           
  % 위의 쿼리의 실행결과 채인이 많이 발생했다면 다음과 같이 테이블을 재생성해준다.                                                                                                         
     1. 체인이 발생한 로우를 찾아 임시 테이블에 저장해준다.                                                                                                      
     CREATE TABLE temp_table                                                                                                      
        AS SELECT * FROM table_name                                                                                                   
           WHERE  ROWID IN ( SELECT HEAD_ROWID                                                                                                 
                             FROM CHAINED_ROWS                                                                               
                                WHERE TABLE_NAME = 'table_name');                                                                           
     2. 체인이 발생한 실제 로우를 찾아 삭제한다.                                                                                                      
     DELETE FROM table_name                                                                                                       
        WHERE ROWID IN ( SELECT HEAD_ROWID FROM CHAINED_ROWS                                                                                                    
                          WHERE TABLE_NAME='table_name');                                                                                 
     3. 임시 테이블에 저장해 두었던 로우를 실제 테이블에 저장시키고 임시 테이블과  CHAINED_ROWS 테이블 로우를 삭제한다.                                                                                                      
     INSERT INTO table_name SELECT * FROM temp_name;                                                                                                      
                                                                                                           
     DROP TABLE temp_table;                                                                                                      
                                                                                                           
     DELETE FROM CHAINED_ROWS                                                                                                       
           WHERE TABLE_NAME = 'table_name';                                                                                                
     4. 다시 ANALYZE 명령을 수행시키고  체인 여부를 확인한다.                                                                                                      
                                                                                                           
                                                                 
                                                                                                           
        1. 양쪽 모두 CHAR2 가 아니므로 문자값 비교가 먼저 수행된다.                                                                                                   
        2. 1의결과가 만약 같다면 길이가 짧은 컬럼 만큼만  문자열 비교하고 만약같다면 같은 것으로 지정된다.                                                                                                   
                                                                                                           
        >> 상수 값과의 비교                                                                                                   
           >>> C1 의타입이 CHAR(200)일경우  C1 = 'ABC' 의 경우 ABC는 아직 CHAR 인지 VARCHAR2인지 정해지지 않은 상수 값이다 이런경우                                                                                                
              타입이 확정되있는 컬럼을 기준으로 바뀌게 되므로 ABC는 CHAR(200)이란 타입이 된다.                                                                                             
           >>> V1 의 타입이 VARCHAR2(200) 일경우 V1='ABC'일 경우 위와 동일하게 ABC는 VARCHAR2(200)이 된다.                                                                                                
           >>> 결국 C1='ABC'가되고 V1='ABC'가 되지만  C1 != V1이 된다.                                                                                                
                                                                                                           
     > NUMBER 타입                                                                                                       
        >> 무조건 가변길이 타입으로 저장된다.                                                                                                   
        >> 소수점자리 지정의겨우 정해진 자리수 이상이 들어가면 그 다음자리에서 반올림되어 저장된다.<<자동이다.                                                                                                   
        >> 연산이 필요한 컬럼은 NUMBER로  지정한다 , NUMBER 타입은 문자열과 비교할때 내부적으로 , 상대타입을 숫자로 전환하므로                                                                                                    
           내부적인 변환이 발생해 인덱스를 사용할수없다, 그러므로 인덱스가 예정된 컬럼은 문자타입으로 하는것이 좋다.                                                                                                
        >> 특히 NUMBER 컬럼을 LIKE='%34%'로 비교하면 상대를 바꿀수 없으므로 NUMBER가 문자 로 바뀌게 된다.                                                                                                   
        >> 그러나 기본키에 해당하는 일련번호는 숫자타입이 유리하다 ,                                                                                                    
                                                                                                           
     > DATE 타입                                                                                                       
        >> NUMBER 타입과 같이 보이는형시과 저장되는 형식이 틀리며 , 각종 계산과 함수 사용이 가능하다.                                                                                                   
        >> 시간까지 지정하지 않으면 기본적으로 0시 0분 0초가 저장이된다.                                                                                                   
        >> LIKE 비교를 하기 위해서는 DATE 컬럼을 TO_CHAR을 사용 CHAR 로 바꾸어야 하고 , 일반 적으로는 상태 컬럼이 DATE 형식으로 바뀌게 된다.                                                                                                   
        >> 빈번한 날짜 연산이 일어나는 타입은 DATE 로 하는것이 좋다.                                                                                                   
                                                                                                           
  % 항상 WHERE 절에 선행하는 컬럼이 =로 비교 되지 않으면 후발 컬럼은 인덱스를 처리하지 않는다.                                                                                                         
                                                                                                           
     > LONG 타입                                                                                                       
        >>  LONG은 VARCHAR2와 거의 동일한 특성을 가지나 2G까지 저장이 가능하다.                                                                                                   
        >> 제한 사항                                                                                                    
           >>> 하나의 테이블에 오직 하나의 LONG 타입 컬럼의 지정이 가능하다.                                                                                                
           >>> NOT NULL을 제외한 다른 제약사항을 지정할수 없다.                                                                                                
            >>> 조건절에 사용되어 다른것과 비교될수 없으며 인덱스를 만들수 없다 .                                                                                                
                단 CLOB 은 ORACLE 9부터 검색기능을 제공해준다.                                                                                             
           >>> 프로시져나 저장형 함수에서 LONG 타입의 변수를 받을수 없다.                                                                                                
              단 Pl/SQL 블록에서는 LONG 타입의 지정이 가능하다 프로시져나 함수에서 입출력변수로 LONG 을 쓸수 없기떄문에  결국 2000바이트만                                                                                              
              사용할수 있는 것이다.                                                                                             
           >>> SELECT 문 내부에서 WHERE 조건절에 여러 함수들과 같이 사용될수 없다 WHERE 에 아예 적을생각을 하지 말라는 의미다. ㅋㅋㅋ                                                                                                
           >>> SQL 함수 SUBSTR 등을  사용할수 없다. || 등에서 SELECT LIST 에 다른 컬럼과 연결시키는 것도 할수 없고 해도 안하니만 못한                                                                                                
              결과가 나온다.                                                                                             
           >>> 서브 쿼리에서 list 로서 사용할수 없다.                                                                                                
                                                                                                           
     > RAW , LONG RAW , ROWID 타입                                                                                                       
        >> 위의 커럼 타입들은 테이타 베이스에 햇사 데시멀 형태로 저장이 되므로  그래픽 이미지나 음성정보등을 관리하기 위해 사용한다,                                                                                                   
            기본 제약사항으로는 RAW 가 VARCHAR2 와 비슷하고, LONG RAW 는 LONG 타입과 비슷하며 ROWID 는 DBMS에서 로우 정보를                                                                                                 
           관리하기 위해 , 생성하는 RAW 이다 실제 테이블에는 RAWID 가 없으며 인덱스에 만 RAWID 가 존재한다.                                                                                                 
           익스포트와 임포트를 하면 RAWID 는 바뀔수 있다.                                                                                                
                                                                                                           
  3. 데이터 길이의 결정                                                                                                         
     > VARCHAR2 타입의 길이 결정                                                                                                       
        >> 가능한 최대치를 부여하는 것이 효과적이다.충분히 길게 지정해도 실제 저장되는 길이는  이와 전혀 상관없으므로….                                                                                                   
     >CHAR  타입의 길이 결정                                                                                                       
        >> 한바이트 라도 들어가면 지정된 크기만큼의 길이가 데이터 베이스에 저장이 되므로 가능한 최소 길이로 지정해야 좋다.                                                                                                   
        >> 길이가 길어진다면 반드시 VARCHAR2를 사용해야 한다.                                                                                                   
     > NUMBER 타입의 길이 결정                                                                                                       
        >> 해당 컬럼의 예상가능한 최대치를 고려하여 가능한 크게 지정해주는 것이 좋다.                                                                                                   
                                                                                                           
                                                                                                           
                                                                                                           

No comments:

Post a Comment