Describe 자원관리 here

SQL> CONN SYSTEM/MANAGER
연결되었습니다.
SQL> COL PROFILE FORMAT A20
SQL> COL RESOURCE_NAME FORMAT A30
SQL> COL LIMIT FORMAT A20
SQL> SELECT * FROM DBA_PROFILES
  2  WHERE RESOURCE_TYPE = 'KERNEL';

PROFILE              RESOURCE_NAME                  RESOURCE_TYPE    LIMIT
-------------------- ------------------------------ ---------------- -----------
DEFAULT              COMPOSITE_LIMIT                KERNEL           UNLIMITED
YASI_PROFILE         COMPOSITE_LIMIT                KERNEL           DEFAULT
DEFAULT              SESSIONS_PER_USER              KERNEL           UNLIMITED
YASI_PROFILE         SESSIONS_PER_USER              KERNEL           DEFAULT
DEFAULT              CPU_PER_SESSION                KERNEL           UNLIMITED
YASI_PROFILE         CPU_PER_SESSION                KERNEL           DEFAULT
DEFAULT              CPU_PER_CALL                   KERNEL           UNLIMITED
YASI_PROFILE         CPU_PER_CALL                   KERNEL           DEFAULT
DEFAULT              LOGICAL_READS_PER_SESSION      KERNEL           UNLIMITED
YASI_PROFILE         LOGICAL_READS_PER_SESSION      KERNEL           DEFAULT
DEFAULT              LOGICAL_READS_PER_CALL         KERNEL           UNLIMITED
YASI_PROFILE         LOGICAL_READS_PER_CALL         KERNEL           DEFAULT
DEFAULT              IDLE_TIME                      KERNEL           UNLIMITED
YASI_PROFILE         IDLE_TIME                      KERNEL           DEFAULT
DEFAULT              CONNECT_TIME                   KERNEL           UNLIMITED
YASI_PROFILE         CONNECT_TIME                   KERNEL           DEFAULT
DEFAULT              PRIVATE_SGA                    KERNEL           UNLIMITED
YASI_PROFILE         PRIVATE_SGA                    KERNEL           DEFAULT

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

SQL> SELECT * FROM DBA_PROFILES
  2  WHERE RESOURCE_TYPE = 'KERNEL'
  3  AND PROFILE = 'DEFAULT'; 

PROFILE              RESOURCE_NAME                  RESOURCE_TYPE    LIMIT
-------------------- ------------------------------ ---------------- -----------
DEFAULT              COMPOSITE_LIMIT                KERNEL           UNLIMITED
DEFAULT              SESSIONS_PER_USER              KERNEL           UNLIMITED
DEFAULT              CPU_PER_SESSION                KERNEL           UNLIMITED
DEFAULT              CPU_PER_CALL                   KERNEL           UNLIMITED
DEFAULT              LOGICAL_READS_PER_SESSION      KERNEL           UNLIMITED
DEFAULT              LOGICAL_READS_PER_CALL         KERNEL           UNLIMITED
DEFAULT              IDLE_TIME                      KERNEL           UNLIMITED
DEFAULT              CONNECT_TIME                   KERNEL           UNLIMITED
DEFAULT              PRIVATE_SGA                    KERNEL           UNLIMITED

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

SQL> COL RESOURCE_NAME FORMAT A30
SQL> COL "설명" FORMAT A60
SQL> COL "레벨" FORMAT A15
SQL> SELECT RESOURCE_NAME, 
  2     DECODE(RESOURCE_NAME, 
  3     'COMPOSITE_LIMIT', '자원의 복수제한(여러개 짬뽕한 값)',
  4     'SESSIONS_PER_USER', '한 사용자가 접속할 수 있는 세션수',
  5     'CPU_PER_SESSION', '한 세션의 총 CPU 시간(초)',
  6     'CONNECT_TIME', '세션을 열은 후 최대 접속시간(분)',
  7     'IDLE_TIME', '한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분)',
  8     'LOGICAL_READS_PER_SESSION', '세션당 논리적 읽기를 할 수있는 블록수',
  9     'PRIVATE_SGA', '오라클 MTS에서의 개인 PGA 영역',
 10     'CPU_PER_CALL', '하나의 데이타베이스 CALL CPU TIME(1/100초)',
 11     'LOGICAL_READS_PER_CALL', '하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수') "설명",
 12     DECODE(RESOURCE_NAME, 
 13     'COMPOSITE_LIMIT', 'COMPOSITE LIMIT',
 14     'SESSIONS_PER_USER', 'SESSION LEVEL',
 15     'CPU_PER_SESSION', 'SESSION LEVEL',
 16     'CONNECT_TIME', 'SESSION LEVEL',
 17     'IDLE_TIME', 'SESSION LEVEL',
 18     'LOGICAL_READS_PER_SESSION', 'SESSION LEVEL',
 19     'PRIVATE_SGA', 'SESSION LEVEL',
 20     'CPU_PER_CALL', 'CALL LEVEL',
 21     'LOGICAL_READS_PER_CALL', 'CALL LEVEL') "레벨"
 22  FROM DBA_PROFILES
 23  WHERE RESOURCE_TYPE = 'KERNEL'                      
 24  AND PROFILE = 'DEFAULT';  

RESOURCE_NAME                  설명                                                         레벨
------------------------------ ------------------------------------------------------------ --------
COMPOSITE_LIMIT                자원의 복수제한(여러개 짬뽕한 값)                            COMPOSITE LIMIT
SESSIONS_PER_USER              한 사용자가 접속할 수 있는 세션수                            SESSION LEVEL
CPU_PER_SESSION                한 세션의 총 CPU 시간(초)                                    SESSION LEVEL
CPU_PER_CALL                   하나의 데이타베이스 CALL CPU TIME(1/100초)                   CALL LEVEL
LOGICAL_READS_PER_SESSION      세션당 논리적 읽기를 할 수있는 블록수                        SESSION LEVEL
LOGICAL_READS_PER_CALL         하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수    CALL LEVE
IDLE_TIME                      한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분)          SESSION LEVEL
CONNECT_TIME                   세션을 열은 후 최대 접속시간(분)                             SESSION LEVEL
PRIVATE_SGA                    오라클 MTS에서의 개인 PGA 영역                               SESSION LEVEL

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

SQL> 
 

위에 설명까지 되어 있습니다.. 약간더 보충한다면 세션레벨 제한은 접속시 즉, CREATE SESSION을
했을때 시스템에 대한 자원의 제한이 설정되는 것이고, 콜 레벨 제한은 SQL문 실행시 제한을
걸게되는 것입니다. 또한 논리적 읽기를 하려면 반드시 물리적 읽기가 적어도 한번은 실행
되어야 하는데 여기서는 이러한 물리적 읽기까지 포함하는 값입니다..

또한, PROFILE은 초기화 파라미터의 RESOURCE_LIMIT = TRUE 해야지만 활성화 됩니다..
해당 세션에서 프로파일을 활성화 하려면 

ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;

하면 됩니다..

이제 CREATE PROFILE에 대한 문법을 살펴보겠습니다..

CREATE PROFILE profile LIMIT 
{ resource_parameters | password_parameters } 
[ resource_parameters | password_parameters ]...;

resource_parameters::=

{ { SESSIONS_PER_USER
  | CPU_PER_SESSION
  | CPU_PER_CALL
  | CONNECT_TIME
  | IDLE_TIME
  | LOGICAL_READS_PER_SESSION
  | LOGICAL_READS_PER_CALL
  | COMPOSITE_LIMIT
  }
  { integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA { integer [ K | M ] | UNLIMITED | DEFAULT }
}

password_parameters::=

{ { FAILED_LOGIN_ATTEMPTS
  | PASSWORD_LIFE_TIME
  | PASSWORD_REUSE_TIME
  | PASSWORD_REUSE_MAX
  | PASSWORD_LOCK_TIME
  | PASSWORD_GRACE_TIME
  }
  { expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION { function | NULL | DEFAULT }
}

저의 어리버리함을 달래줄...원래 메뉴얼의 설명입니다..

SESSIONS_PER_USER
Specify the number of concurrent sessions to which you want to limit the user.

CPU_PER_SESSION
Specify the CPU time limit for a session, expressed in hundredth of seconds.

CPU_PER_CALL
Specify the CPU time limit for a call (a parse, execute, or fetch), expressed in
hundredths of seconds.

CONNECT_TIME
Specify the total elapsed time limit for a session, expressed in minutes.

IDLE_TIME
Specify the permitted periods of continuous inactive time during a session, 
expressed in minutes. Long-running queries and other operations are not subject 
to this limit.

LOGICAL_READS_PER_SESSION
Specify the permitted number of data blocks read in a session, including blocks 
read from memory and disk.

LOGICAL_READS_PER_CALL
Specify the permitted the number of data blocks read for a call to process a 
SQL statement (a parse, execute, or fetch).

PRIVATE_SGA
Specify the amount of private space a session can allocate in the shared pool of 
the system global area (SGA), expressed in bytes. Use K or M to specify this limit 
in kilobytes or megabytes.

 
SQL> CREATE PROFILE YASI_PROFILE LIMIT 
  2     SESSIONS_PER_USER          UNLIMITED 
  3     CPU_PER_SESSION            UNLIMITED 
  4     CPU_PER_CALL               3000 
  5     CONNECT_TIME               45 
  6     LOGICAL_READS_PER_SESSION  DEFAULT 
  7     LOGICAL_READS_PER_CALL     1000 
  8     PRIVATE_SGA                15K
  9     COMPOSITE_LIMIT            5000000; 
CREATE PROFILE YASI_PROFILE LIMIT
*
1행에 오류:
ORA-02379: YASI_PROFILE 프로파일이 이미 존재합니다


SQL> ALTER PROFILE YASI_PROFILE LIMIT 
  2     SESSIONS_PER_USER          UNLIMITED 
  3     CPU_PER_SESSION            UNLIMITED 
  4     CPU_PER_CALL               3000 
  5     CONNECT_TIME               45 
  6     LOGICAL_READS_PER_SESSION  DEFAULT 
  7     LOGICAL_READS_PER_CALL     1000 
  8     PRIVATE_SGA                15K
  9     COMPOSITE_LIMIT            500000; 

프로파일이 변경되었습니다.

SQL> 
 

COMPOSITE_LIMIT 에서는 비용을 따진 수치입니다..복수제한에서 제한할 수 있는 자원은

CPU_PER_SESSION, CONNECT_TIME, PRIVATE_SGA, LOGICAL_READS_PER_SESSION의 4가지 입
니다. 위의 예에서 보는 것처럼 수치가 큰 이유는 이들 4가지 값을 계산하여서 적용하
는 것이기 때문입니다..

여기서 각각의 자원을 관리하기 위해서 ALTER RESOURCE COST 문을 사용합니다..
이것은 COMPOSITE_LIMIT에 할당된 값에 대한 값들의 모임이라고 생각하면 됩니다..
즉, COMPOSITE_LIMIT 에 영향을 끼치는 것은 CREATE PROFILE에 나타난 값들이 아니라
아래의 ALTER RESOURCE COST 에서 결정한 값이라고 할 수 있습니다.


ALTER RESOURCE COST 
{ CPU_PER_SESSION 
| CONNECT_TIME 
| LOGICAL_READS_PER_SESSION 
| PRIVATE_SGA
}
integer [
        {CPU_PER_SESSION 
        | CONNECT_TIME 
        | LOGICAL_READS_PER_SESSION 
        | PRIVATE_SGA
        } integer
        ] ... 
;
 

COMPOSITE_LIMIT 에 적용하는 값에 대한 계산 방법은 다음과 같습니다. 만약 다음과 같이
RESOURE_COST를 설정했다고 하면..

 
SQL> ALTER RESOURCE COST
  2  CPU_PER_SESSION 500
  3  LOGICAL_READS_PER_SESSION 100
  4  CONNECT_TIME 10;

자원 비용이 변경되었습니다.


만약.. A라는 사용자가 CPU를 5초 사용했고,  3000 블록을 읽었으며, 접속시간이 60분이고,
MTS기반이 아니라면... 다음과 같이 계산된다. 주의할 것은 단위이다..
      
CPU_PER_SESSION --> 1/100 초단위                      
LOGICAL_READS_PER_SESSION --> 블록단위     
CONNECT_TIME --> 분단위            
PRIVATE_SGA --> KB단위             

TOTAL COST = (CPU_PER_SESSION + LOGICAL_READS_PER_SESSION + CONNECT_TIME + PRIVATE_SGA)

CPU_PER_SESSION --> 5초 --> 500
LOGICAL_READS_PER_SESSION --> 3000 블록
CONNECT_TIME --> 60분


SQL> SELECT RESOURCE_NAME, LIMIT 
  2  FROM DBA_PROFILES
  3  WHERE RESOURCE_NAME = 'COMPOSITE_LIMIT'
  4  AND PROFILE = 'YASI_PROFILE';

RESOURCE_NAME                  LIMIT
------------------------------ --------------------
COMPOSITE_LIMIT                500000

SQL> 
SQL> SELECT (500* 500) + (3000*100) + (60*10) TOTAL_COST FROM DUAL;

TOTAL_COST
----------
    550600

SQL> 


사용제한 수치를 넘었으므로 A사용자의 작업은 롤백이 됩니다. 중요한 것은 자원사용의
제한에 걸리기 전에 COMMIT한 작업은 모두 정상적으로 되나, 자원의 제한에 걸려서 진행
한 작업은 COMMIT 될 수 없다는 것입니다. 


참고...

COL RESOURCE_NAME FORMAT A30
COL "설명" FORMAT A60
COL "레벨" FORMAT A15
SELECT RESOURCE_NAME, 
   DECODE(RESOURCE_NAME, 
   'COMPOSITE_LIMIT', '자원의 복수제한(여러개 짬뽕한 값)',
   'SESSIONS_PER_USER', '한 사용자가 접속할 수 있는 세션수',
   'CPU_PER_SESSION', '한 세션의 총 CPU 시간(초)',
   'CONNECT_TIME', '세션을 열은 후 최대 접속시간(분)',
   'IDLE_TIME', '한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분)',
   'LOGICAL_READS_PER_SESSION', '세션당 논리적 읽기를 할 수있는 블록수',
   'PRIVATE_SGA', '오라클 MTS에서의 개인 PGA 영역',
   'CPU_PER_CALL', '하나의 데이타베이스 CALL CPU TIME(1/100초)',
   'LOGICAL_READS_PER_CALL', '하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수') "설명",
   DECODE(RESOURCE_NAME, 
   'COMPOSITE_LIMIT', 'COMPOSITE LIMIT',
   'SESSIONS_PER_USER', 'SESSION LEVEL',
   'CPU_PER_SESSION', 'SESSION LEVEL',
   'CONNECT_TIME', 'SESSION LEVEL',
   'IDLE_TIME', 'SESSION LEVEL',
   'LOGICAL_READS_PER_SESSION', 'SESSION LEVEL',
   'PRIVATE_SGA', 'SESSION LEVEL',
   'CPU_PER_CALL', 'CALL LEVEL',
   'LOGICAL_READS_PER_CALL', 'CALL LEVEL') "레벨"
FROM DBA_PROFILES
WHERE RESOURCE_TYPE = 'KERNEL'                      
AND PROFILE = 'DEFAULT';