프로그램/database

Oracle Utility 3/3

mulderu 2010. 8. 25. 20:49
Transparent Data Encryption 사용하기 -10g 
Transparent Data Encryption 사용하기

0) make sure your Oracle database 10g r2 installed with the selected feature
   SQL> select * from v$option;
   PARAMETER                    VALUE
   Transparent Data Encryption  TRUE
   
1) create a wallet location 
   mkdir C:\oraclexe\oradata\wallet
   If you were not made the directory, default is '$ORACLE_BASE/admin/$ORACLE_SID/Wallet.

2) set wallet_location parameter in SQLNET.ORA
   add the following lines
   encryption_wallet_location=
  (source=(method=file)(method_data=(directory=C:\oraclexe\oradata\wallet)))

3) set encryptiion key
   SQL> alter system set encryption key identified by tiger;
   OR the latest version
   SQL> alter system set encryption key authenticated by tiger;
   
   Then you can see a wallet file (i.e. ewallet.p12) in the wallet_location

4) restart DB, and open wallet
   SQL> alter system set encryption wallet open identified by tiger;
   OR
   SQL> alter system set encryption wallet open authenticated by tiger;
   And after using the encryption wallet, you can close it as:
   SQL> alter system set encryption wallet close;
   
5) create a table with ENCRYPT option such as:
   SQL> create table encrypt_test
     1  (noencrypt varchar2(50), 
     2   inencrypt varchar2(50) encrypt);
	
Then as far as you opened your wallet, you can insert/select the encrypt column without any pasword.
	


문제점을 발견한 SQL 문의 튜닝.....

1. 시스템을 파악해야 한다.

   - 데이터의 성격을 명확히 알아야만 한다.
   - 튜닝 방법을 선택하기 위한 체크리스트를 작성한다.
   - 사용하는 SQL 쿼리를 분석한다.
     1) SQL*PLUS 에서 "set autotrace on" 명령을 수행하고 TKPROF를 이용하여 분석한다.
     2) 문제가되는 SQL 문의 explain plan을 조회한다.
     3) "set timing on" 명령을 수행하여 실행 시간을 검사한다.

   ** 한 세션만 트레이스를 거는 방법
      1) select sid, serial# from v$session where username='SCOTT'; 해당 유저의 id를 알아낸다.
      2) execute dbms_system.set_sql_trace_in_session({SID},{Serial#},TRUE);


2. Analyze 를 한다.
   Optimizer의 파싱연산을 더욱 정확하게 수행토록 유도할 수 있다.

   -Analyze table [table 명] compute statistics;   테이블 전체 연산.
   -Analyze table [table 명] estimate statistics;  테이블이 큰 경우 1064row 까지만 연산.
   -Analyze table [table 명] delete statistics;    이전 연산결과 삭제.
   - 한 유저의 모든 테이블을 분석할경우
     exec dbms_utility.analyze_schema('SCOTT','COMPUTE');


3. Hint 를 사용한다.

   - table Full Scan을 유도
     select /*+ FULL(table_name) */ column1, 2 .. from table_name ... ;

   - index 사용을 유도
     select /*+ INDEX(table_name index_name1, 2 .. ) */ column1,2 .. from table_name ... ;

   - table 을 순서대로 조인하도록 유도
     select /*+ ORDERED */ column1,2 .. from table1, table2 ... ;     

   - Cost-based 연산시 또는 모든 row 를 캐쉬하도록 유도(인덱스를 사용 않하도록 유도)
     select /*+ ALL_ROWS */ .... ;

   - Cost-based 연산시 응답속도를 빠르게 하기위해 (인덱스 걸린 컬럼 쿼리시)
     select /*+ FIRST_ROWS */ .... ;


4. 인덱스를 생성/삭제 한다.

   EX1) 인덱스가 항상 좋은가 ??
       EMP 테이블은 10만건의 데이터가 있고 DEPT_NO=10 것은 2만5천건
       존재한다고 할때 수행시간 비교.

    select ENAME from EMP where DEPT_NO=10;
       
   1) 인덱스가 없을때 : 약 55초 소요
   2) 인덱스가 있을때 : 약 70초 소요
   3) dept_no, ename 의 복합 인덱스가 있을때 : 약 0.1초 소요.
      (단, ename은 unique)

   ** 인덱스가 걸리는 컬럼은 중복값이 적은것이 좋다. 만일 전체의 25% 이상의 중복
      값을 가지는 값을 쿼리시 시간이 더 걸리게 된다.


   EX2) 인덱스와 힌트의 적절한 사용....
       EMP 테이블은 1만건의 데이터가 있고, DEPT_NO에 인덱스가 걸려있고,
       DEPT_NO>9990 것은 5천건 존재한다고 할때 수행시간 비교.

    select ENAME, DEPT_NO from EMP where DEPT_NO>9990;
     -> 약 53초 소요

    select /*+ FULL(EMP) */ ENAME, DEPT_NO from EMP where DEPT_NO>9990;
     -> 약 4초 소요


   EX3) join 테이블의 쿼리시 속도비교
        EMP 테이블은 10만건, DEPT 테이블은 10건의 데이터가 있을때.

    select ENAME, DEPT_NO from EMP, DEPT 
    where EMP.DEPT_NO = DEPT.DEPT_NO and EMP_NO=5 and DEPT_NO=10 ;
     -> 약 4분 소요 된다면

    select /*+ ORDERED */ ENAME, DEPT_NO from EMP, DEPT 
    where EMP.DEPT_NO = DEPT.DEPT_NO and EMP_NO=5 and DEPT_NO=10 ;
     -> 약 15초 소요
  
    select ENAME, DEPT_NO from EMP where EMP_NO=5 and EXISTS
             ( select 'X' from DEPT where EMP.DEPT_NO = DEPT.DEPT_NO 
                          and DEPT_NO=10 ) ;
     -> 약 8초 소요

     ** Exists, Union 등의 연산자는 속도를 개선시켜줌.

5. 테이블을 조정한다.

/*

**  테이블 analyze 스크립트 2..                      <박제용>

**  한 유저에 속한 모든 객체를 analyze한다. 

**

**  사용방법 SQL>@analyze0 [유저ID]   

**                          유저ID는 반드시 대문자로.

*/

exec dbms_utility.analyze_schema('&&schema','DELETE');

exec dbms_utility.analyze_schema('&&schema','COMPUTE');

/* 일부 데이터만 분석할 경우..
exec dbms_utility.analyze_schema('&schema','ESTIMATE',estimate_percent => 10);
*/