Database/Oracle2012. 4. 18. 17:01

설치 파일은 오라클 홈페이지에서 배포중인 10204_vista_w2k8_x64_production_db.zip 를 사용했습니다. 총 3개의 파일을 수정해야 하며, 관리자 권한으로 설치하세요. 윈도우즈7에만 TEST 해 보았으나 윈도우즈 서버 2008 R2 에서도 같은방법으로 설치 가능할겁니다.(아마도...^^)32/64bit 모두 동일하게 적용이 가능합니다. OS가 64bit 라도 32bit Oracle 설치가 가능합니다.


<기본 설치 환경>
OS : Microsoft Windows7 32bit / 64bit
DB : Oracle 10g 32bit / 64bit

<설치전에 수정해야 할 파일 및 내용>
- 빨간 글씨 부분이 추가/수정 해야 할 내용 입니다. 메모장 등의 문서편집기로 수정하면 됩니다.(총 3부분)
기본폴더이름은 사용자별로 다를수 있습니다.

① \10204_vista_w2k8_x64_production_db\database\install\oraparam.ini

[Certified Versions]

#You can customise error message shown for failure, provide value for CERTIFIED_VERSION_FAILURE_MESSAGE
Windows=5.0,5.1,5.2,6.0,6.1

② \10204_vista_w2k8_x64_production_db\database\stage\prereq\db\refhost.xml

<CERTIFIED_SYSTEMS>

<OPERATING_SYSTEM>
<VERSION VALUE="5.0"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<VERSION VALUE="5.1"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<VERSION VALUE="5.2"/>
</OPERATING_SYSTEM>
<!--Microsoft Windows Vista-->
<OPERATING_SYSTEM>
<VERSION VALUE="6.0"/>
</OPERATING_SYSTEM>
<!--Microsoft Windows 7-->
<OPERATING_SYSTEM>
<VERSION VALUE="6.1"/>
</OPERATING_SYSTEM>
</CERTIFIED_SYSTEMS>

③ \10204_vista_w2k8_x64_production_db\database\stage\prereq\db_prereqs\db\refhost.xml

<CERTIFIED_SYSTEMS>

<OPERATING_SYSTEM>
<VERSION VALUE="5.0"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<VERSION VALUE="5.1"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<VERSION VALUE="5.2"/>
</OPERATING_SYSTEM>
<!--Microsoft Windows Vista-->
<OPERATING_SYSTEM>
<VERSION VALUE="6.0"/>
</OPERATING_SYSTEM>
<!--Microsoft Windows 7-->
<OPERATING_SYSTEM>
<VERSION VALUE="6.1"/>
</OPERATING_SYSTEM>
</CERTIFIED_SYSTEMS>



기본설치

기본 설치로 진행 할 경우 오류가 발생합니다. 꼭 고급 설치 로 진행해야 합니다.


 

오류

기본 설치를 할 경우 다음과 같은 오류가 발생할수 있습니다. [오류] Oracle 홈 이름은 적합하지 않습니다. Oracle 홈 이름은 128자 이하여야 하며 영문자와 밑줄만 포함되야 합니다.


 

고급 설치

고급 설치로 진행 합니다. 이후 부터는 별다른 주의 사항이 없습니다. 자신에게 맞는 적당한 옵션을 선택하여 설치하세요.

 

출처 : http://guisin.net/69

Posted by 아로나
Database/Oracle2012. 3. 19. 00:29

create tablespace : 오라클 데이터베이스내에서 생성되고 처리될 테이블들의 레코들들이 실제로 존재할 영역을 디스크 상에 물리적으로 생성시키는 명령어이다.

 tablespace_name : 생성될 테이블 스페이스의 이름이다.

 datafile : 데이터베이스내에서 사용되는 레코드들이 실제로 디스크상에 파일로 존재하게 되는데, 이때의 파일의 위치와 이름을 지정하는 곳이다.

 data_file : 데이터베이스내에서 사용되는 레코드들이 실제로 디스크상에 파일로 존재하게 되는데, 이때의 파일의 위치와 이름을 지정하는 곳이다.

 data_full_file_name : 레코드들이 실제로 존재할 디렉토리(절대패스사용)와 파일의 이름이다.

 size : 테이블 스페이스내의 레코드들을 저장할 디스크상의 파일의 최대 코기를 지정해 줄 수 있다.

 datafilesize : 레코드들을 저장할 파일의 크기를 k(킬로바이트), M(메가바이트)의 단위를 사용하여 나타낼 수 있다.

 initial : 테이블 생성시 해당 테이블에 할당되어 있는 영역의 크기를 지정해 줄 수 있다.

 datafilesize_min : 테이블생성시 사용할 수 있는 공간의 크기로, 예를 들어 10m로 지정되면 생성된 임의의 테이블에 입력되는 데이터들을 10m의 영역에 저장한다는 의미이다.

 next : 처음에 저장될 데이터의 영역인 initial만큼을 다 쓰고 더 이상의 공간이 없을 때, 사용할 수 있는 영역을 할당 시켜 준다.

 datafilesize_max : 추가로 테이블에 데이터가 입력될 때, 사용할 수 있는 여역의 크기이다. 예를 들어 5M를 할당하여 두면, 임의의 테이블이 사용한 영역이 10M (위의 initial영역의 크기이다)를 넘을 경우, 주가로 5M만큼의 영역을 더 사용할 수 있게 된다. 따라서 총 사용공간은 15M가 된다.

 minextents minuum : next 영역으로 할당할 수 있는 최소의 갯수를지정해 줄 수 있다.

 maxextents maxnum : next 영역으로 할당할 수 있는 최대의 갯수를 지정해 줄 수 있다.

 picincrease num : next를 지정하여 추가로 사용할 영역을 확장하고자 할 때, 늘어날 영역의 크기를 '%'로 나타낸 값이다. pct는 '%'를 의미한다. 예를 들어 picincrease 5라고 지정해 두면, next로 추가로 작업할 영역을 늘여 줄때, 처음에는 next롤 설정된 영역만을 확장시켜 주나, 두 번째부터는 next영역의 크기에서 5%만큼 더 크게 확장시켜 주게 되는 것이다.

 online/offline : 테이블 스페이스 생성시 online이나 offline 중 택일하여 쓸 수 있으며, 생략하면 online을 의미한다.
online으로 설정하여 테이블 스페이스를 생성하면, 테이블스페이스를 생성함과 동시에 데이터베이스 사용자들이 사용가능하다는 것을 의미하며, 일반적으로 online으로 설정하여 사용한다.

 -- 테이블스페이스 정보 조회
select * from dba_data_files; 
select * from dba_tablespaces;

-- 테이블스페이스생성
  create tablespace info_data
  datafile '/oracle/infodata/infodata.dbf'
  size 200m
  default storage(
     initial     80k
     next        80k
     minextents  1
     maxextents  121
     pctincrease 80
     )online;

-- 테이블스페이스 online / offline
 > alter tablespace tablespace_name offline;
 > alter tablespace tablespace_name online;

 -- 생성된 테이블 스페이스의 추가하기 공간 늘여주기
  alter tablespace info_data
  add datafile '/oracle/infodata/infodata/dbf'
  size 100m;

 -- 생성된 테이블 스페이스 크기 변경하기
  alter database datafile '/oracle/infodata/infodata.dbf'
  RESIZE 200M;

 -- 테이블스페이스 변경하기
  alter tablespace tax2110
  default storage(
     initial        1024k
     next           2048k
     minextents     1
     maxextents     5
    )online ;
  pctincrease 기본이 50%이다

 -- 테이블스페이스 자동확장 추가 (Automatic Extension)
  alter tablespace tax2110
  add datafile 'd:\tablespace\tax2110_03.dbf'
  size 50m
  autoextend on next 10m
  maxsize 100m;
  -> maxsize 를 지정할때 데이터 화일보다 크거나 같아야함.

 -- 기존테이블스페이스에 자동확장 변경하기
  alter database datafile 'd:\tablespace\tax2110_03.dbf'
  autoextend on next 10m
  maxsize 100m; 

 -- 테이블스페이스 삭제
  drop tablespace tablespace_name
  including contents    --> 테이블스페이스의 모든 세그먼트를 삭제( 데이터가 있는 테이블스페이스는 삭제할수 없다)
  cascade constraints;  --> 삭제된 테이블스페이스 내의 테이블의 기본키와 유일키를 참조하는
         다른 테이블스페이스의 테이블로부터 참조무결성 제약 조건을 삭제합니다.
$ rm kit.dbf    -- Drop한 tablespace명의 Datafile이 kit.dbf일때.


 -- 테이블 스페이스 의 물리적파일까지 삭제하기
drop tablespace test_tbs including contents and datafiles; 
 

-- 오프라인 테이블스페이스
  alter tablespace tax2110 offline;
 
-- 데이터베이스 사용자 아이디 생성 및 수정
  create user 사용자아이디
  identified by 비밀번호(새비밀번호)


-- 유저생성
create user panda
identified by panda123

default tablespace yswater_ts;


-- 생성한 유저에 권한주고 연결하기
grant resource,connect to panda;
grant dba to panda;

CREATE TABLESPACE SWERPDB_DATA
       DATAFILE 'D:\DATABASE\SWERPDB_DATA01.ORA' SIZE 100M
       AUTOEXTEND ON NEXT 10M MAXSIZE 4000M
       EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT  AUTO;

CREATE TABLESPACE SWERPDB_INDEX
       DATAFILE 'D:\DATABASE\SWERPDB_INDEX01.ORA' SIZE 100M
       AUTOEXTEND ON NEXT 10M MAXSIZE 4000M
       EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT  AUTO;

CREATE TEMPORARY TABLESPACE SWERPDB_TEMP
       TEMPFILE 'D:\DATABASE\SWERPDB_TEMP01.ORA' SIZE 100M
       AUTOEXTEND ON NEXT  5M MAXSIZE  1000M
       EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1024K;

-- USER 생성하여 tablespace를 USER에게 지정
create user swerpuser identified by swerpuser
       default   tablespace swerpdb_data
       temporary tablespace swerpdb_temp;

-- USER에게  DB권한설정
grant connect, resource, dba to swerpuser;

-- drop user swerpuser cascade;

-- drop tablespace swerpdb_data  including contents cascade constraints;
-- drop tablespace swerpdb_index including contents cascade constraints;
-- drop tablespace swerpdb_temp  including contents cascade constraints;

grant CREATE DATABASE LINK, CREATE TABLE, ALTER ANY TABLE, BACKUP ANY TABLE, DROP ANY TABLE, SELECT ANY TABLE,INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE,
      CREATE PROCEDURE, CREATE ANY PROCEDURE, ALTER ANY PROCEDURE, DROP ANY PROCEDURE, EXECUTE ANY PROCEDURE, CREATE SESSION,LOCK ANY TABLE,COMMENT ANY TABLE,
      CREATE SEQUENCE, CREATE ANY SEQUENCE, ALTER ANY SEQUENCE, DROP ANY SEQUENCE,SELECT ANY SEQUENCE, CREATE TRIGGER, CREATE ANY TRIGGER, ALTER ANY TRIGGER, DROP ANY TRIGGER,
      CREATE VIEW, CREATE ANY VIEW,DROP ANY VIEW
 TO RMUSER;



출처 : http://bangganji.tistory.com/77

'Database > Oracle' 카테고리의 다른 글

UNDO TABLESPACE 조회  (0) 2012.07.10
[펌]윈도우7에서 오라클10g 설치하기  (0) 2012.04.18
[펌] SQL 바인딩 변수와 리터럴 상수 테스트  (0) 2012.03.18
[펌] granularity 란?  (0) 2012.03.18
[펌] cardinality 란?  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 12:07

05 바인드 변수의 중요성

  • 테스트 준비
    SQL> CREATE TABLE t AS SELECT * FROM all_objects;
    
    테이블이 생성되었습니다.
    
    SQL> UPDATE t SET object_id = ROWNUM;
    
    6989 행이 갱신되었습니다.
    
    SQL> CREATE UNIQUE INDEX t_idx ON t(object_id);
    
    인덱스가 생성되었습니다.
    
    SQL> ANALYZE TABLE t COMPUTE STATISTICS;
    
    테이블이 분석되었습니다.
    
    SQL> SET AUTOT TRACEONLY EXPLAIN
    
    SQL> SELECT object_name FROM t WHERE object_id = 1000;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2929955852
    
    -------------------------------------------------------------------------------------
    | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |       |     1 |    20 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |    20 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX UNIQUE SCAN         | T_IDX |     1 |       |     1   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("OBJECT_ID"=1000)
    
    SQL> SET AUTOT OFF
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
  • 바인드변수 테스트
    SQL> SET TIMING ON
    SQL> DECLARE
      2    TYPE rc IS REF CURSOR;
      3    l_rc rc;
      4    l_object_name t.object_name%TYPE;
      5  BEGIN
      6    FOR i IN 1 .. 20000
      7    LOOP
      8      OPEN l_rc FOR
      9        'SELECT /* test1 */ object_name
     10           FROM t
     11          WHERE object_id = :x' USING i;
     12      FETCH l_rc INTO l_object_name;
     13      CLOSE l_rc;
     14    END LOOP;
     15  END;
     16  /
    
    PL/SQL 처리가 정상적으로 완료되었습니다.
    
    경   과: 00:00:00.96
    SQL> SELECT sql_text
      2       , loads
      3       , parse_calls
      4       , executions
      5       , fetches
      6    FROM v$sql
      7   WHERE sql_text LIKE '%test1%'
      8     AND sql_text NOT LIKE '%v$sql%'
      9     AND sql_text NOT LIKE '%DECLARE%'
     10  ;
    
    SQL_TEXT                        LOADS PARSE_CALLS EXECUTIONS FETCHES
    ------------------------------- ----- ----------- ---------- -------
    SELECT ... WHERE object_id = :x     1       20000      20000   20000
    
    경   과: 00:00:00.04
    1. 하드파싱 1회에 20000회 실행 : 커서 공유 확인
    2. PARSE_CALLS이 20000회 발생된 이유는 Dynamic Sql 을 사용했기 때문
    3. Static Sql 을 사용했다면 PARSE_CALLS 1회만 발생.
  • 리터럴 상수 테스트
    SQL> DECLARE
      2    TYPE rc IS REF CURSOR;
      3    l_rc rc;
      4    l_object_name t.object_name%TYPE;
      5  BEGIN
      6    FOR i IN 1 .. 20000
      7    LOOP
      8      OPEN l_rc FOR
      9        'SELECT /* test2 */ object_name
     10           FROM t
     11          WHERE object_id = ' || i;
     12      FETCH l_rc INTO l_object_name;
     13      CLOSE l_rc;
     14    END LOOP;
     15  END;
     16  /
    
    PL/SQL 처리가 정상적으로 완료되었습니다.
    
    경   과: 00:00:08.62
    
    SQL> SELECT SUBSTR(sql_text, 56, 25) sql_text
      2       , loads
      3       , parse_calls
      4       , executions
      5       , fetches
      6    FROM v$sql
      7   WHERE sql_text LIKE '%test2%'
      8     AND sql_text NOT LIKE '%v$sql%'
      9     AND sql_text NOT LIKE '%DECLARE%'
     10  ;
    
    SQL_TEXT                LOADS PARSE_CALLS EXECUTIONS FETCHES
    ----------------------- ----- ----------- ---------- -------
    WHERE object_id = 15977     1           1          1       1
    WHERE object_id = 15978     1           1          1       1
    WHERE object_id = 15979     1           1          1       1
    WHERE object_id = 15980     1           1          1       1
    WHERE object_id = 15981     1           1          1       1
    ...                                                        
    WHERE object_id = 19996     1           1          1       1
    WHERE object_id = 19997     1           1          1       1
    WHERE object_id = 19998     1           1          1       1
    WHERE object_id = 19999     1           1          1       1
    WHERE object_id = 20000     1           1          1       1
    
    4228 개의 행이 선택되었습니다.
    
    경   과: 00:00:01.62
    1. 수행시간 증가 : 0.96 초 ==> 8.62 초 (약 9배)
    2. 수행횟수만큼 커서 생성 되어 공유 영역에서 15772건이 밀려나고 4228건만 남아 있음
    3. 엄청남 성능 저하 : 커서 공유 안됨, 하드 파싱 2만회
  • 바인드 변수 사용의 효과
    1. 커서를 많이 생성하지 않고 하나를 반복 재사용하므로 메모리 사용량과 파싱 소요시간을 줄여준다.
    2. 시스템 전반의 메모리와 cpu 사용률을 낮춰 데이터베이스 성능과 확장성을 높이는대 기여
    3. 동시사용자 접속이 많을 경우 영향력이 크다.

문서정보

'Database > Oracle' 카테고리의 다른 글

[펌]윈도우7에서 오라클10g 설치하기  (0) 2012.04.18
[펌] Oracle Tablespace 추가/변경  (0) 2012.03.19
[펌] granularity 란?  (0) 2012.03.18
[펌] cardinality 란?  (0) 2012.03.18
[펌] Lock 과 Latch 분류표  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 11:08

데이터와 관련하여 등장하는 granularity 란 "데이터 분할의 정도"를 의미한다.

http://en.wikipedia.org/wiki/Granularity#Data_granularity

The granularity of data refers to the fineness with which data fields are sub-divided. For example, a postal address can be recorded, with low granularity, as a single field:

  1. address = 200 2nd Ave. South #358, St. Petersburg, FL 33701-4313 USA

or with high granularity, as multiple fields:

  1. street address = 200 2nd Ave. South #358
  2. city = St. Petersburg
  3. postal code = FL 33701-4313
  4. country = USA
주소를 문자열 하나로 표현 할 수도 있고, 국가,시/군/구, 거리 등으로 분할하여 표현할 수도 있다. 이 두가지 방식은 granulirity가 서로 다른 것이다.

궁금해서 찾아봤다. 딱 한마디로 뭐라 표현해야 할지는 모르겠네.

출처 : http://kwon37xi.egloos.com/4419441

'Database > Oracle' 카테고리의 다른 글

[펌] Oracle Tablespace 추가/변경  (0) 2012.03.19
[펌] SQL 바인딩 변수와 리터럴 상수 테스트  (0) 2012.03.18
[펌] cardinality 란?  (0) 2012.03.18
[펌] Lock 과 Latch 분류표  (0) 2012.03.18
[펌] Latch 란 무엇인가  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:48

Actual Cardinality 란?
 
Oracle이 실행계획을 수립하는데 있어서 가장 중요한 요소이며, 굳이 용어를 번역하면 "예상 로우(ROW)수" 가 된다.

Cardinality기본 개념

Cardinality는 특정 집합에 속한 원소(element)의 를 의미한다.

Oracle에서 Cardinality의 의미 네가지

 Base Cardinality           [기반]  특정 Table의 전체 Row 수를 의미한다.
 Calculated Cardinality   [산출]  Predicate(특정조건), 즉 조건절에 의해 Filtering된 Row 수를 의미한다.  
EX> [Table t1의 전체 Row 수가 1000 건이고 t1.c1 > 100 조건을 만족하는 Row 수가 100건이라고 가정]
Cardinality(t1) = 1000 이되며, Calculated Cardinality(t1.c1 > 100) = 100 이 된다.
 Estimated Cardinality    [추측]  Base Cardinality 이건, Calculated Cardinality이건 Oracle이 실행 계획을 세우는 단계에서 사용하는 모든 Cardinality[집합원의 개수]는 예측치이다. 혹은 Estimated Row Count라고도 한다.
 Actual Cardinality         [실제]  Query를 수행한 후 계산된 실제 Row 수를 의미한다.
Estimated Cardinality은 실행 계획 수립단계에서 알수 있으나, Actual Cardinality 은 실제 실행 후에만 알 수 있다.


Actual Cardinality에 사용하는 용어

 Density  특정Column의 농도. 즉 분포도가 얼마나 진한가를 나타낸다.
Distinct Count와  Skewness에 의해 결정된다.
 Distinct Count  NDV라고도하며, Distinct Count가 작을수록 column의 농도는 진하다. 반면 Distinct Count가 높으면 농도가 묽다.
Distinct Count = 1/NDV의 공식으로 계산된다.
 Skewness Data가 특정 값들에 편향되어 있는 경우를 Skewness가 높다라고 표현한다.
 Selectivity  특정조건(Predicate)의 선택도를 의미한다.
 *조동욱님 O3. 333~327page 참조*

Density 와 Selectivity의 차이

 Density는 특정 Column의 고정된 속성이다. 하지만 Selectivitys는 컬럼값이 아닌 Predcate에 따라 변하는 속성이다.

예를 들어 column c1의 Density 가 0.1 인 경우 [c1 = :b1] predicate의 selectivity는 0.1 이지만,
[c1 > : b1] Predicate의 selectivity는 0.05 이다. 
[c1 > 1] 의 Predicate의 selectivity 는? Column의 최대값과 최소값에 의해 결정된다.


Cardinality 예측 실습 [O3. 325페이지]

http://sites.google.com/site/ukja/books-cbo-in-depth/chapter5/01--cardinalities-sql 

조동욱님의 O3 325페이지를 보면서 위 조동욱님의 실습을 함께 하였다. 한번 한 이것을 다 나열하는 것보다는
TEXT 파일을 펼쳐서 직접 하나 하나 해보면서 결과를 보면 큰 도움이 된다.


출처 방형욱 oracle 강사님의 실습파일


주의 : O3교제와 함께 보며, 실습에 나오는 스크립을 알고 아래
 "[예측]실습 카페 정리 본" 은 위의 파일을 받아 "한번이라도 하고 하고 하길 바란다!'


Cardinality 예측 실습  

 카페 : http://cafe.naver.com/gseducation/469                                                       간편보기 "클릭" >>>>>>>>

생성하기

 drop table t1 purge;
 create table t1(c1 int, c2 int);
 create index t1_n1 on t1(c1+1);

 insert into t1
 select 1, mod(level, 2)+1
 from dual
 connect by level <= 10000
 union all
 select 2, mod(level, 300)+1
 from dual
 connect by level <= 1000
 union all
 select 3, mod(level, 50)+1
 from dual
 connect by level <= 100
 union all
 select 4, mod(level, 5)+1
 from dual
 connect by level <= 10;

commit;


 select c1, count(*) from t1 group by c1 order by 1;
 select c2, count(*) from t1 group by c2 order by 1;

 1. Histogram 없는 경우

  SQL> exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size 1');

 SQL> @tab_stat t1
  -----------------
 TABLE_NAME                   : T1
 NUM_ROWS                      : 11110
 -----------------
 TABLE_NAME                    : T1
 COLUMN_NAME                : C1
 NUM_DISTINCT                  : 4
 DENSITY                           : .25
 -----------------
 TABLE_NAME                    : T1
 COLUMN_NAME                 : C2
 NUM_DISTINCT                  : 300
 DENSITY                           : .00333333333333333
 -----------------

          set autot traceonly explain
          variable b1 number
  
1) select * from t1 where c1 = 1;      select 1/4  * 11110 from dual;
2) select * from t1 where c1 = :b1;   select 1/4  * 11110 from dual; 
3) select * from t1 where c1 > :b1;   select 0.05 * 11110 from dual;
4) select * from t1 where c1 = 0;           select (1/4 * 11110) - (1/4 * 11110 / (4-1)) from dual;
          select * from t1 where c1 = 5;     select (1/4 * 11110) - (1/4 * 11110 / (4-1)) from dual;
          select * from t1 where c1 = -1;    select (1/4 * 11110) - (1/4 * 11110 / (4-1)) - (1/4 * 11110 / (4-1)) from dual;
          select * from t1 where c1 = 6;     select (1/4 * 11110) - (1/4 * 11110 / (4-1)) - (1/4 * 11110 / (4-1)) from dual; 


  2. Histogram 있는 경우

 SQL> exec dbms_stats.gather_table_stats(user, 't1', method_opt=>'for all columns size skewonly');


 SQL> @tab_stat t1

 -----------------
 TABLE_NAME                    : T1
 COLUMN_NAME                : C1
 NUM_DISTINCT                 : 4
 NUM_NULLS                     : 0
 DENSITY                          : .000045004500450045
 LOW_VALUE                     : C102
 HIGH_VALUE                    : C105
 HISTOGRAM                     : FREQUENCY
 -----------------
 TABLE_NAME                   : T1
 COLUMN_NAME                : C2
 NUM_DISTINCT                 : 300
 NUM_NULLS                     : 0
 DENSITY                       : .406332971731016
 LOW_VALUE                     : C102
 HIGH_VALUE                    : C204
 HISTOGRAM                     : HEIGHT BALANCED
 -----------------

 TABLE_NAME           COLUMN_NAME          ENDPOINT_NUMBER ENDPOINT_VALUE
 -------------------- -------------------- --------------- --------------------
 T1                   C1                             10000 1()
 T1                   C1                             11000 2()
 T1                   C1                             11100 3()
 T1                   C1                             11110 4()
 T1                   C2                               113 1()
 T1                   C2                               228 2()
 T1                   C2                               229 4()
 ... 생략 ...
 T1                   C2                               253 286()
 T1                   C2                               254 300()


 
 
 Frequency : -> Density = (1/전체 Row의 개수) / 2

 1) select * from t1 where c1 = 1;     10000
 2) select * from t1 where c1 = :b1;   select 1/4 * 11110 from dual;  
 3) select * from t1 where c1 > :b1;   select 0.05 * 11110 from dual;
 4) select * from t1 where c1 = 5;     1
     select * from t1 where c1 = 6;     1

 
 Height-balanced : -> Density = sum of the square of the frequency of the nonpopular values /
                                    (number of nonnull rows * number of nonpopular nonull rows) (10.2.0.2 이후 버전 기준)

 1) select * from t1 where c2 = 1;     select 113/254 * 11110 from dual;
      select * from t1 where c2 = 4;     select .406332971731016 * 11110 from dual;
 2) select * from t1 where c2 = :b1;   select .406332971731016 * 11110 from dual;   
 3) select * from t1 where c2 > :b1;   select 0.05 * 11110 from dual; 
 4) select * from t1 where c2 = 301;   select (.406332971731016 * 11110) - (.406332971731016 * 11110 / (300 - 1))
                                                     from dual; 
   
    select * from t1 where c2 = 302;  
    select (.406332971731016 * 11110) - (.406332971731016 * 11110 / (300 - 1)) -(.406332971731016 * 11110 / (300 - 1))
    from dual; 














출처 : http://baind.tistory.com/entry/Cardinality

'Database > Oracle' 카테고리의 다른 글

[펌] SQL 바인딩 변수와 리터럴 상수 테스트  (0) 2012.03.18
[펌] granularity 란?  (0) 2012.03.18
[펌] Lock 과 Latch 분류표  (0) 2012.03.18
[펌] Latch 란 무엇인가  (0) 2012.03.18
[펌] Lock 개요  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:38

래치와 락의 차이점을 집중적으로 들어가기에 앞서 가볍게 래치와 락의 차이를 알아보자.

 분류            래치(LATCH)             락(LOCK)
 목적  하나의 목적을 수행함 : 메모리 구조에 대한 배타적인 접근을 위함 (오라클 9i부터 cache buffers chains latch 들은 읽기 전용시에 공유가 가능함)
-거의 독점적-
 두가지 목적을 수행함 : 락 모드가 호환 가능하면 다수의 프로세스가 동일한 리소스를 공유하는 것을 허용하며, 락 모드가 호환 가능하지 않으면 리소스에 대한 배타적인 접근만 허용함 (공유lock이 많음)
 사용범위  sga내부의 데이터 구조에만 적용.
메모리 오브젝트를 임시적으로 보호함.
단일 오퍼레이션으로 메모리 구조에 대한 접근 제어. 트랜잭션 단위가 아님.
 테이블, 데이터 블록 및 state object와 같은 오브젝트를 보호함.
 데이터베이스의 데이터 또는 메타데이터 접근제어. 트랜잭션 단위
 획득방식  두가지 모드로 요청이 가능
willing-to-wait 또는 no-wait
 6가지 모드로 요청가능 : null, row share, row exclusive, share, share row exclusive, 또는 exclusive
아래 표 참조.
 범위  sga내부에 정보가 존재하며, 로컬 인스턴스에만 볼 수 있음.
- 인스턴스 레벨로 작동-
 데이터베이스 내부에 정보가 존재하며, 모든 인스턴스에서 볼 수 있음. lock은 데이터 베이스 레벨에서 작동.
 복잡도  단순한 명령어를 사용하여 구현됨.
일반적으로 test-and-set, compare-and-swap 또는 단순한 cpu명령어. 구현이 쉬움
 문맥 교환(context switch)을 포함한 일련의 명령어들을 사용하여 구현됨. 구현이 복잡하다.
 지속기간  짧은 순간만 지속됨
(microsecond단위) = 100만분의 1초
 일정시간동안 지속
(트랜잭션 동안)
 큐(Queue)  프로세스가 래치 획득을 실패 한 후 슬립(sleep) 상태로 들어갈 때, 해당 요청은 큐(queue)로 관리되지 않으며, 요청한 순서대로 서비스 되지않음
(latch wait list를 이용하여 큐방식으로 사용되는 래치들은 예외)
 프로세스가 락 획득을 실패한 후, 해당 요청은 큐(queue)로 관리되며, 요청한 순서대로 서비스됨(nowait 모드는 예외)
 데드락(DEADLOCK)  데드락이 발생되지 않도록 구현됨
(레벨방식)
 락은 큐 방식을 사용하며, 데드락이 발생될 가능성이 높다. 데드락이 발생 될 때마다 트레이스 파일이 생성된다.

참조 : 조동욱님 OWI책 P49


 
LOCK 획득방식중 6가지 모드 표

 모드  설명
 0  None
 1  Null(N)
 2  Sub-Shared(SS) 또는 Row-shared(RS)
 3  Sub-Exclusive(SX) 또는 Row-Exclusive(RX)
 4  Shared(S)
 5  Shared-Sub-Exclusive(SSX)
 Shared-Row-Exclusive(SRX)
 6  Exclusive(X)


참조 : 조동욱님 OWI책 P70














출처 : http://baind.tistory.com/entry/LATCH-와-LOCK-분류표

'Database > Oracle' 카테고리의 다른 글

[펌] granularity 란?  (0) 2012.03.18
[펌] cardinality 란?  (0) 2012.03.18
[펌] Latch 란 무엇인가  (0) 2012.03.18
[펌] Lock 개요  (0) 2012.03.18
[펌] Cursor 란??  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:36

래치란 무엇인가?

 래치란 빠르고 가볍게 특정 리소스에 대한 동기화를 구현하기 위한 객체(object)이다.

 특징
 1. 래치는 물리적으로 Shared Pool 영역에 존재하는 일종의 메모리 구조체이다.
 2. 래치는 매우간단하고 작은 메모리 영역을 사용하며, 래치를 획득(get)하고 해제(release)하는 작업들 또한 하드웨어에
     맞게 최적화 되어있다.
 3. 일반적으로 하드웨어 칩셋이 제공하는 TEST-AND-SET, COMPARE-AND-SWAP와 같은 명령을 사용하므로 래치를
     획득하고 해제하는 행위는 원자성(Atomicity)이 보장된다.
 4. 래치를 보호하기 위해 별도의 소프트웨어적인 동기화 장치가 필요없다


래치가 보호하는 리소스?

래치가 보호하는 리소스는 SGA다. SGA에 접근하는 모든 프로세스는 반드시 해당 영역을 관장하는 래치를 획득 한 후에만 접근이 허용하기 때문이다.

분석

SQL문을 실행하고자 하는 프로세서는 해당 SQL을 Share Pool의 library cache 영역에 올려야 한다. 이 때 필요한 힙(HEEP)-익스턴트 개념- 메모리 영역을 할당 받기 위해서는 반드시 Shared pool latch를 획득해야한다.

1. shared pool래치는 보통 전체 인스턴스에 하나만 존재한다.
2. 한번에 하나의 프로세스만이 힙으로 부터 **청크(chunk)**를 할당 받을 수 있다.
3. select 문을 통해서 특정 데이터 블록을 읽기 위해 해시 체인(Hash chain)에 접근하고자 하는 모든 프로세스는 반드시
    해당 체인을 관장하는 cache buffer chains 래치를 획득해야한다.
5. DML을 통해서 데이터를 변경한 모든 프로세스는 PGA영역에 redo데이터를 생성. 이 리두 데이터를 리두 버퍼(redo buffer)
   로 복사하기 위해 먼저 redo copy 래치를 획득해야 한다.

이렇듯 SGA의 특정영역을 탐색하거나 변경하고자 하는 프로세스는 반드시 해당 영역을 관장하는 래치를 획득해야한다. 이를 통해 SGA의 자원을 보호한다.

청크!! HEEP 구조!! library cache구조!!

 

Shared Pool Memory의 구조

 

 

~ 물리적인 관점에서 shared pool의 메모리는 그래뉼을 추가로 쌓는 형식으로 할당되기 때문에

   힙(Heap)이라는 용어를 사용한다. 이때 하나의 그래뉼이 하나의 extent가 된다.

~ Extent는 다양한 크기의 chunk로 나누어질 수 있다. chunk의 상태는 free, recreatable, freeable,

   permanent로 나누어지며 free와 recreatable(현재 사용중이지 않으면서 재생성 가능) chunk만

   재사용할 수 있다.

 

Shared Pool의 Heap 구조

 

 

~ Memory 공간 요청시 Chunk 단위로 할당

~ Freelist : Free Chunk의 목록

~ LRU List : 현재 사용중이지 않은 재생성 가능 Chunk 목록(Unpinned Recreatable Chunk)

~ Reserved Freelist : 최상위 Heap에만 존재, Shared Pool의 예약 영역에 대한 Freelist

~ Freelist에서 원하는 크기의 chunk 검색 -> LRU List 검색

    -> 특정 크기 이상이면 Reserved list 검색 -> 모두 실패하면 ORA-4031에러

 

Library Cache 구조

 

~ Shared Pool에서 가장 중요한 부분 중의 하나인 Library Cache 영역은 SQL문의 수행과 관련된 
   모든 정보들을 관리하는 영역이다. Library Cache 메모리는 Library Cache Manager(KGL, Kernel
   Generic Library Cache)에 의해 관리되는데, KGL은 KGH를 이용해서 필요한 메모리 청크를 
   할당 받는다.

~ Library Cache 메모리는 [해시 테이블 -> 버킷 -> 체인 -> 핸들 -> 오브젝트]의 구조로 되어 있다.

~ 오라클은 객체 이름(가령 SQL 텍스트)에 해시함수를 적용해 생성된 해시값을 이용해 적절한
   해시 버킷(Hash Bucket)을 할당하며, 같은 해시값을 지니는 객체들은 체인(리스트)으로 관리된다.

~ 하나의 Library Cache 핸들(이하 핸들)은 하나의 Library Cache Object(이하 LCO)를 관리한다. 
   핸들은 실제 LCO에 대한 메타정보 및 포인터 역할을 하며 LCO가 실제 정보를 담고 있다.

~ LCO가 포함하는 정보 중 중요한 것들은 다음과 같다. 
   - Dependency Table  
   - Child Table
   - Data Blocks  

Shred Pool 관련 latch

  

 

출처  : http://wiki.ex-em.com

참고  : Practical OWI in Oracle 10g(그림으로 명쾌하게 풀어쓴)  

출처 : http://blog.naver.com/gseducation?Redirect=Log&logNo=20099683486
                


                                            (주)엑셈

                        
                                              한민호님

'Database > Oracle' 카테고리의 다른 글

[펌] cardinality 란?  (0) 2012.03.18
[펌] Lock 과 Latch 분류표  (0) 2012.03.18
[펌] Lock 개요  (0) 2012.03.18
[펌] Cursor 란??  (0) 2012.03.18
[펌] Chunk 란?  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:34

LOCK?

 latch가 SGA를 보호한다면, lock은 database 전체를 보호한다.
태이블, 트랜잭션, 언두 세그먼트, 테이블 스페이스, 잡(job) 등 데이터 베이스 단위에서
피요한 대부분의 리소스들은 락의 보호를 필요로 하며 복잡하다.

간략히 정리해보면

1. 데이터베이스 내부에 정보가 존재하며, 락은 데이터베이스 레벨에서 작동한다.
2. 문맥 교환을 포함한 일련의 명령어를 사용하여 구현되어져 복잡하고 무겁다.
3. 트랜젝션 동안 지속된다.
4. 프로세스가 락 획득을 실패한후, 해당 요청은 queue관리되며, 요청한 순서대로 서비스된다. nowait는 예외이다.
5. 6가지 모드로 요청이가능. [아래 표 참조]
   (null, row share, row exclusuve, share, share row exclusive, exclusive)
  *모드간의 호환성 관계 존재. [아래 표 참조]
  *매우 복잡한 작업에 대한 동기화 작업도 가능.


LOCK 획득방식중 6가지 모드 표
 
 모드  설명
 0  None
 1  Null(N)
 2  Sub-Shared(SS) 또는 Row-shared(RS)
 3  Sub-Exclusive(SX) 또는 Row-Exclusive(RX)
 4  Shared(S)
 5  Shared-Sub-Exclusive(SSX)
 Shared-Row-Exclusive(SRX)
 6  Exclusive(X)


락 모드 호환성 표

          N         SS      SX (RX)         S        SSX          X
 N         ○         ○         ○          ○          ○         ○
 SS         ○         ○         ○         ○         ○         X
 SX (RX)         ○         ○         ○          X         X         X
 S         ○         ○         X         ○         X         X
 SSX         ○         ○         X         X         X         X
 X         ○         X         X         X         X         X
                                                                   - 참조 : 조동욱님 OWI책 P70 -
 *붉은 색 표시된 부분은 유심히 볼 필요가 있다.




LOCK의 기본적인 분류

Enqueue lock

 
enqueue 구조로 관리되는 lock이다. 오라클 10g부터 대부분 enqueue락에 대해 개별 대기 이벤트가 등록되므로 V$event_name 뷰를 조회하면 어떤 종류의 enqueue락이 존재하는지 알 수 있다.

enqueue lock이 보호하는 리소스(resource)의 형태는??

 <<Resource = TYPE - ID1 - ID2 >>

구분

 user type lock     :  TX(트랜젝션), TM(테이블 리소스), UL(언두 세그먼트)
 system type lock :  HW, US, CI, TC, SQ.... (V$EVENT_NAME로 확인 가능)
 
 *V$LOCK_TYPE 뷰 참조10g*

  
일반 LCOK

 enqueue lock이 아닌 일반락인 경우에는 별도의 리소스 구조체가 존재하지 않기때문에 이를 구분하기 위한 리소스 구분자도 없다.
또한 V$LOCK과 같은 통합뷰로도 볼 수 없다.
일반 락의 발생여부 및 경합 여부를 알수 있는 가장 좋은 방법은  V$SESSION_WAIT 뷰에서 대기현상이 발생하는지 관찰하는 것이다.

EX>

 buffer lock 경합이 발생하면 buffer busy waitsread by other session 이벤트에 대한 대기현상이 발생한다.
 row cache lock 경합이 발생하면 row cache lock 대기현상 발생.
 library cache lock/pin 경합이 발생하면 library cache lock/pin 대기현상 발생.

구분

 row type lock
 library cache lock
 library cache pin
 buffer lock




 LOCK 획득 매카니즘

                                                                  - (주)엑셈 practical OWI 15P 참조-
 
순서

 1. Process A가 shared 모드로 락(lock)획득 시도
 2. 해당 락을 점유한 프로세스가 존재하지 않으므로 Process A가 shared 모드로 락 획득하며
    Process A를 보유프로세스 목록(OWNER LIST)에 등록 한다.
 3. Process W가 exclusive 모드로 락 획득 시도
 4. Process A가 shared 모드로 락을 획득하고 있으므로 락 획득 실패하며 Process W는
    대기 프로세스 목록에(Waiter list)에 등록 한다.
 5. 보유 프로세스목록에 등록되어 있는 프로세스가 작업을 완료(commit, roll back등)하면
     대기프로세스 목록에 존재하는 다른 프로세스를 깨운다.
 6. 대기프로세스 목록에 등록된 프로세스는 타임아웃 시간이 경과 후에도 깨워주지 않으면 스스로 깨어나서
     데드락(dead lock)이 발생했는지 여부를 확인 후 다시 대기 상태로 빠진다.


타임 아웃

데드락을 피하기 위해 대기목록의 프로세스는 3초마다 깨어남
데드락 체크 후 다시 대기목록에 들어감
데드락이 확인 되면, 락 요청은 취소되고 현재 SQL문을 roll back 한다.


타임 아웃 시간

enqueue lock : 3초
buffer lock  : 일반 1초, 연속적으로는 3초
row cache lock : 60초
library cache lock / pin : 일반프로세스3초. PMON은 1초

(주)엑셈 practical OWI 15P를 참조













출처 : http://baind.tistory.com/entry/LOCK

'Database > Oracle' 카테고리의 다른 글

[펌] Lock 과 Latch 분류표  (0) 2012.03.18
[펌] Latch 란 무엇인가  (0) 2012.03.18
[펌] Cursor 란??  (0) 2012.03.18
[펌] Chunk 란?  (0) 2012.03.18
[펌] 라이브러리 캐쉬 구조  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:20

 CURSOR 란?

 오라클에서 CURSOR란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL 문을 실행시키면 결과값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 fetch해 처리하여 해당 결과 셋을 프로그래밍적으로 접근할수 있게 도와주는 기능이다.

 이해를 돕기위해 아래의 명시적 커서 예문을 보자.
 하단의 선언문(DECLARE)에서 SELECT한 결과값을 실행문(BEGIN)에서 FETCH 하여 한 결과값을 순차적으로 처리할 수 있다. 뭐 이해가 안가도 그냥 보자.


열심히 그렸다. 참견 말자.


CURSOR는 묵시적커서(Implicit Cursor)와 명시적커서(Explicit Curosr)로 나뉜다.



묵시적 커서 (Implicit Cursor)

 묵시적 커서는 각 SQL문장의 실행 결과에 접근하여 그 결과값을 이용하기 위한 내부적 커서이다. 간단히 변수를 이용한다고 생각해도 좋겠다. 일반적으로 SELECT문, 혹은 다른 속성에서 값을 얻어와 변수에 저장하는데 사용된다.

예문)
SELECT name
          into v_name
 FROM members
 WHERE student_no = 13;
 v_count = SQL%ROWCOUNT;

상단의 예문의 빨간 부분은 모두 묵시적 커서가 사용된 문장이다. 예문 내에는 커서가 선언된 부분이 없지만 v_name변수로 해당 SELECT문의 결과값이 (당연히 저 SELECT문의 결과는 1개여야 한다. 그 이상일 경우 에라.) 저장된다. 또 하단의 SQL%ROWCOUNT의 값이 v_count변수에 할당된다. 물론 SELECT문에서 나온 행수는 1개이므로 v_count에는 1이 들어간다.


묵시적 커서에서는 위에 사용된 SQL%ROWCOUNT와 같이 4가지 속성을 제공한다.

SQL%ROWCOUNT : 최근 실행된 SQL문의 결과 행 갯수를 리턴
SQL%FOUND : 최근에 실행된 SQL문의 결과 행 존재 유무, 결과값이 있을때 TRUE를 리턴.
SQL%NOTFOUND : SQL%FOUND와 반대
SQL%ISOPEN : 최근에 실행된 SQL문의 묵시적 커서의 종료 유무





명시적 커서 (Explicit Cursor)

 명시적 커서는 처음의 맨 상단의 예제와 같이 일반적으로 어떠한 결과값을 글로벌 영역에 저장해놓고 순차적으로 값을 Fetch해 이용하기 위해 사용된다. 명시적 커서라고 불리우는 이유는 묵시적 커서와는 다르게 명시적으로 CURSOR라고 선언하고 사용하기 때문에 누가봐도 커서니깐. 그렇게 불린다. 머. 아님말고.

 명시적 커서는 간단히 아래와 같이 4단계로 나뉜다.

 CURSOR :  커서 선언
 OPEN : 커서 열기
 FETCH ~ INTO : 커서가 가리키는 곳의 결과 값을 엑세스
 CLOSE : 커서 닫기


 다시 한번 상단의 그림으로 한단계씩 살펴보자.



1) DECLARE 
    CURSOR cursor_name IS 
    sql_statement;
커서를 선언하고 커서 선언문 내에 선언된 sql_statment를 실행하여 해당 결과값을 시스템 글로벌영역에 결과 값을 저장한다.



2) BEGIN
    OPEN cursor_name;
해당 커서 내음의 작업을 위해 커서 영역을 오픈한다.
이때 선언문에서 선언한 sql_statement를 실행해 해당 결과값을 구성한뒤 커서는 해당 결과값의 첫번째 행에 커서를 위치 시킨다.


3) FETCH cursor_name INTO variable1, variable2, ...;

cursor_name의 커서를 순차적으로 FETCH한다. 이때 cursor_name의 SELECT 문에 있는 컬럼 갯수와 variables의 갯수가 값아야 한다. 그 순서대로 variables에 값이 할당된다.



4) CLOSE cursor_name;

현재 오픈되어 있는 커서를 닫는다.



상단의 예에서 보듯이 CURSOR는 루프 문이 아니다. JAVA에서의 VECTOR등의 같이 결과값을 하나씩 순차적으로 FETCH할때만 사용된다. 적절히 사용하기 위해서는 LOOP문과 같이 사용하면 된다.




이상으로 간단하게 오라클의 CURSOR에 대하여 알아보았다. 많이 쓰이는 예이니 다들 꼭 기억해 두길 바란다. 지영옹.

출처 : http://freeend.tistory.com/entry/CURSOR-%EB%9E%80

'Database > Oracle' 카테고리의 다른 글

[펌] Latch 란 무엇인가  (0) 2012.03.18
[펌] Lock 개요  (0) 2012.03.18
[펌] Chunk 란?  (0) 2012.03.18
[펌] 라이브러리 캐쉬 구조  (0) 2012.03.18
[펌] SQL 처리과정  (0) 2012.03.18
Posted by 아로나
Database/Oracle2012. 3. 18. 10:13

Chunk

특징

  1. extent에 할당되는 메모리 조각. 블록보다 큰 단위
  2. X$KSMSP : Shared pool 메모리에 할당된 chunk와 상태, 사용현황 확인
  3. KSMCHCOM 컬럼 : 메모리 할당 목적 확인
  4. 고유한 이름을 갖고 있으며 view로 내용 확인 가능
  5. Chunk 종류

문서정보

'Database > Oracle' 카테고리의 다른 글

[펌] Lock 개요  (0) 2012.03.18
[펌] Cursor 란??  (0) 2012.03.18
[펌] 라이브러리 캐쉬 구조  (0) 2012.03.18
[펌] SQL 처리과정  (0) 2012.03.18
[펌] SQL과 옵티마이저  (0) 2012.03.18
Posted by 아로나