오라클에서 시퀀스(sequence) 사용하는 방법을 알아보겠습니다.

오라클의 시퀀스는 MySql이나 MSSQL의 auto_incremet(자동증가)와 같은 것이라 생각하면 되겠습니다.

이것은 중복되지 않는 값을 주기 위해 사용하는데,,,

만약, 회원 1000명에게 회원번호를 부여해야 하는데 서로 중복되지 않는 값을 부여해야 할 경우,

처음 회원에게는 1번을, 그 다음회원에게는 2번을,,,, 1000번까지 각각 부여할 수 있을 겁니다.

즉, 지금까지 부여한 번호를 간직하고 있다가 다음 회원이 왔을 때 그 다음 번호를 부여하는 역할을 시퀀스라는 넘이 해줍니다.

 
 

시퀀스 테스트를 위해 임의의 테이블을 만들어 보겠습니다.

CREATE TABLE test (
            sq_id NUMBER
,            sq_name VARCHAR2(20)
);



 
이제 test라는 테이블에 시퀀스를 만들어 보겠습니다.
 

CREATE SEQUENCE sq_test
INCREMENT BY 1
START WITH 10000;



INCREMENT BY 1 : 자동 증가 칼럼의 증가치가 1이라는 뜻
START WITH 10000 : 자동 증가 칼럼이 10000부터 증가한다는 뜻


CREATE SEQUENCE 라는 문장을 사용하여 sq_test 이름의 시퀀스를 만들었습니다.

이제부터 sq_test를 사용하여 sq_id를 자동 증가 칼럼으로 사용할 수가 있습니다.

 

 
그럼, 데이터를 입력해서 확인해 보겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '이순신');


 
여기서, sq_id에 MYSQ.NEXTVAL이라는 데이터를 입력했는데, 시퀀스의 다음값을 가져오게 됩니다.
(시퀀스를 사용할 때 NEXTVAL이라는 슈도 칼럼(Pseudo-column)을 사용합니다.)

그럼, 실제로 sq_id에 값이 어떻게 들어갔는지 확인해 보겠습니다.
 

SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신



 
시퀀스 생성시에 START WITH 10000; 라고 했기 때문에 10000이라는 값이 들어갔습니다.

다시 한번 데이타를 입력해 보겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '홍길동');


SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신
10001            홍길동

 

 
10000 에서 1이 자동증가하여 10001이라는 값이 입력되었습니다.

이번엔,,, SQ_NAME이 '홍길동'인 로우를 지워보겠습니다.
 

DELETE FROM test WHERE sq_name = '홍길동';


SQ_ID            SQ_NAME
----------------------
10000            이순신

 

 
다시 새로운 데이터를 하나 넣겠습니다.
 

INSERT INTO test(sq_id, sq_name) VALUES(sq_test.NEXTVAL, '김철수');


SELECT * FROM test;


SQ_ID            SQ_NAME
----------------------
10000            이순신
10002            김철수


 

 
sq_id에 10001이 아니라 10002가 들어가 있습니다.

왜냐하면, 시퀀스는 그 특성상 일단 한번 증가하면 그 값이 절대 다시 줄어들지 않기 때문입니다.

이것은 mysql이나 mssql의 auto increment(자동증가)와도 동일합니다.
 


시퀀스를 생성할 때, 값의 범위를 지정할 수 있습니다.

CREATE SEQUENCE sq_test
INCREMENT BY 1
START WITH 100;
MINVALUE 1
MAXVALUE 1000



이렇게 시퀀스를 생성하면, 100부터 시작하고 값은 1~1000 사이의 값만 생성을 시킬 수 있습니다.


[출처] http://iurim.com/uboard.asp?id=webstudy_tip&cate_no=307&u_no=310&code=webstudy

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
Windows 32bit OS 에서 Oracle Memory Sizing  (0) 2008.08.13
BITMAPPED INDEX  (0) 2008.08.12
REVERSE KEY INDEX  (0) 2008.08.12

USB 휴대용 저장 장치 마운트

1. 첫 번째 방법
# insmod ide-scsi 명령을 수행한 후 mnt 디렉토리 내에 usb-drive 폴더를 만들고, USB가 연결 되어 있는 상태에서 # mount -t vfat /dev/sda1 /mnt/usb-drive 명령을 실행합니다.
차후에는 # mount -t vfat /dev/sda1 /mnt/usb-drive 명령만 실행하면 됩니다.

2. 두 번째 방법
부팅시에 자동으로 USB 메모리를 마운트 하기위해 /mnt/usb 라는 폴더를 생성하고, /etc/fstab에 다음과 같이 넣습니다.
/dev/sda1   /mnt/usb    auto   noauto,iocharset=cp949,user 0 0
USB 메모리를 꼽을때 자동으로 인식시키도록 하기 위해 /etc/hotplug/usb/usb-storage 파일을 만들고 다음을 입력하고 # chmod 755 usb-storage 명령을 실행합니다.
--------------------------------------------------------------------
#!/bin/sh
#
# /etc/fstab 설정에 따라 /mnt/usb에 마운트
mount /mnt/usb
--------------------------------------------------------------------
USB 메모리 저장장치를 다시 마운트 하기 위해서는 mnt 디렉토리 내에서 # mount /dev/sda1 명령을 수행하고, 언마운트하기 위해서 # umount /dev/sda1 명령을 수행해야 하며, 수정된 내용을 저장하기 위해서는 반듯이 언마운트 시켜야 합니다.

[mntent]: warning: no final newline at the end of /etc/fstab 라는 에러메시지가 나올때는 fstab 문서의 제일 하단줄에 엔터라인(공백)을 추가해 주어야 합니다.



'LinuX' 카테고리의 다른 글

linux 파티션 나누기  (0) 2009.05.08
Cron  (0) 2008.11.24
linux make law device(리눅스 raw device 생성)  (0) 2008.09.04
dpkg와 apt 사용하기  (0) 2008.01.08
apt-get 명령어  (0) 2008.01.08
linux make law device(리눅스 raw device 생성) Linux(redhat계열)
rawdevice 사용하기
rawdevice 는 DB등의 애플리케이션에서 성능을 위하여 OS를 거치지 않고 직접 해당 디스크를 이용하는 방식입니다.

ㅇ fdisk 이용 파티션 생성
예) /dev/sdb1 100M
     /dev/sdb2 500M

ㅇ raw device 매핑하기
RHEL 2.1/3.0 의 경우 raw device는 /dev/raw/ 디렉토리에 있습니다.

  raw /dev/raw/rawN <major> <minor>
  raw /dev/raw/rawN /dev/<blockdev>

앞에서 fdisk를 이용하여 만든 파티션(블락디바이스)와 raw 명령을 이용하여 매핑작업을 합니다.

raw /dev/raw/raw1 /dev/sdb1
raw /dev/raw/raw1 /dev/sdb2

raw 디바이스 세팅 상황을 보려면 -q 옵션을 이용하면 됩니다.

  raw -q /dev/raw/rawN
  raw -qa

raw 매핑하는 것은 재부팅시 자동으로 실행하도록 해야 합니다. 그러기 위해서 /etc/rc.d/rc.local 에 명령을 넣어둘수 있습니다.

RHEL 에서는 위 과정을 편하게 할 수 있도록 /etc/sysconfig/rawdevices 파일에 설정내용을 넣어둘 수 있습니다.
이 경우에는 /etc/init.d/rawdevices 프로그램을 부팅시 자동으로 시작할 수 있도록 해야 합니다.
chkconfig --level 345 rawdevices on -> runlevel 3,4,5 에서 rawdevices 를 자동으로 시작하도록 함

참고로 raw 디바이스 매핑을 할 수 있지만 이것을 해제하는 것은 없는 것으로 보여집니다.
일반적으로 초기 세팅시 이 과정을 진행하기 때문에 이때문에 문제가 있을것이란 생각은 들지 않습니다.

ㅇ raw device 에 대한 소유권 조정
해당 raw device 에 대해 필요한 사용자 및 그룹으로 소유권을 조정합니다.

chown oracle9i.dba  device 명
chmod 660 device 명

ㅇ 해당 프로그램에서 사용시
해당 프로그램에서 사용시에는 위에서 만든 raw device 명을 지정하여 사용하면 됩니다.

'LinuX' 카테고리의 다른 글

linux 파티션 나누기  (0) 2009.05.08
Cron  (0) 2008.11.24
USB 휴대용 저장 장치 마운트  (0) 2008.09.08
dpkg와 apt 사용하기  (0) 2008.01.08
apt-get 명령어  (0) 2008.01.08
제품 : Database

작성날짜 : 2007-12-21

PURPOSE
-------

Windows 32bit OS 메모리 제약과 Oracle 에서 추가메모리 사용하도록 설정하는 방법을 설명한다.


CONTENTS
--------

1. Windows 32bit 메모리 확장 관련 용어들
2. Windows 32bit 메모리 확장 설정 방법
3. AWE_WINDOW_MEMORY 파라미터 산정
4. Windows 에서 Oracle 메모리 사용량 모니터링
5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

EXPLANATIONS
------------

1. Windows 32bit 메모리 확장 관련 용어

- /3GB
Windows 32bit OS 에서 메모리 어드레싱은 4GB 까지 가능하고, 이 중 2GB 는 커널이 사용하고
나머지 2GB 가 사용자 프로세스에게 할당되는 최대 메모리 크기이다. Windows 2000 이상에서는
/3GB 옵션을 사용하여 커널에 1GB 만 할당하고 나머지 3GB 를 사용자 프로세스에게 할당하여
2GB 한계를 넘어 메모리를 확장하여 사용할 수 있다. OS 에서는 boot.ini에 /3GB 옵션 추가하고,
어플리케이션 실행파일 헤더에 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 이 설정되어 있으면 된다.
Oracle 8.1.7 이상에서는 기본적으로 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 설정되었으므로 3GB
사용가능하다. 참고로 Windows 64bit OS 는 한 프로세스당 어드레싱 가능한 메모리가 8TB 이므로
32bit 에서 사용하는 추가적인 옵션들이 필요없다.

- /PAE (Physical Address Extentions)
/3GB 옵션과 더불어 32bit 메모리 제약을 넘기위한 방법으로, 가상 메모리내에 포인터 테이블로
"별도 메모리 영역"을 매개함으로 프로세스가 사용할 수 있는 실제 메모리 크기를 확장한다.
예를들어 Oracle 은 가상 메모리 2GB 영역 (/3GB 사용하면 3GB) 내에 포인터 테이블(window)만
저장하고 실제 DB BUFFER CACHE 는 "별도 메모리 영역" 에 할당한 후, BUFFER CACHE 사용시
포인터 테이블을 매개하여 실제 BUFFER CACHE 영역 사용한다. 여기서 "별도 메모리 영역" 도
메모리를 사용하는 것이다.

- AWE (Address Windowing Extensions) & Oracle 구현방식
AWE 는 PAE 기능을 사용하도록 어플리케이션에 제공된 API 이다.
AWE API 를 사용한 오라클 버젼들은 아래와 같다.
* Oracle 8.1.6.x
* Oracle 8.1.7.x
* Oracle 9.2.x
* Oracle 10.1.x
* Oracle 10.2.x

주의! 9.1.0.x 는 AWE 지원안됨.

AWE 구현된 Oracle 버젼들은 3GB 이상의 SGA 사용할 수 있는데, 정확히 말하면 SGA 중 BUFFER CACHE
영역만 3GB 이상의 "별도 메모리 영역"에 지정할 수 있다. 오라클에서 AWE 를 사용하면 BUFFER CACHE
사용시 포인터 테이블과 실제 BUFFER CACHE 가 있는 별도 메모리 영역과의 mapping & unmapping
과정이 추가되므로 기본적인 처리보다 느릴 수 있지만, 적어도 IO 을 줄일 수 있기 때문에
IO 느린 시스템에서는 성능 향상을 기대할 수 있다.


2. Windows 32bit 메모리 확장 설정 방법

- boot.ini 에 /3GB /PAE option 을 추가
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE

- 오라클 서비스 실행하는 OS USER 에 "Lock memory pages"의 권한 부여
. Start -> Programs -> Administrative Tools -> Local Security Policy
(on a Domain Controller, click on 'Domain Security Policy' instead of 'Local Security Policy')
. Double-click on the 'Lock Pages in memory' policy.
. Add the appropriate user and click 'Ok'.
. Restart the OracleService<SID>

- 포인터 테이블 (window) 크기 지정하는 AWE_WINDOW_MEMORY 를 레지스트리 추가
. HKEY_LOCAL_MACHINE => Software => Oracle => HomeX 에 AWE_WINDOW_MEMORY=1024000000 추가
주의! 여러 인스턴스라면 각 Home 에 추가

- init.ora 에 USE_INDIRECT_DATA_BUFFERS=TRUE 추가하고 DB_BLOCK_BUFFERS 로 BUFFER CACHE 크기 설정

주의! DB_CACHE_SIZE 로 BUFFER CACHE 지정하면 에러 발생한다.
ORA-00385: cannot enable Very Large Memory with new buffer cache parameters

- Oracle10g 에서는 SGA_TARGET=0 설정하여 Automatic Memory Management 를 disable 해야한다.


3. AWE_WINDOW_MEMORY 크기 계산 방법

(1) 기본값 : AWE_WINDOW_MEMORY = 1GB

/PAE /3GB 를 지정해도 아래 메모리들의 총합은 3GB 내에 들어와야한다.
- AWE_WINDOW_MEMORY
- BUFFER CACHE 제외한 SGA (shared_pool, large_pool, java_pool, log_buffers ...)
- Overhead for Oracle.exe DLLs (100MB 정도)
- Stack space per thread (1MB/thread)
- PGA and UGA

결국 BUFFER CACHE 최대 크기는 OS 메모리 - 4GB + AWE_WINDOW_MEMORY 로 산정된다.
(여기서 4GB는 Oracle이 사용하는 3GB와 OS에서 사용하는 1GB의 합. 결국 이 영역을 제외한 나머지 영역에 buffer cache를 지정하여 사용할 수 있다.)
예를들어 12GB RAM 시스템에서 최대 BUFFER CACHE 크기= (Total RAM - 4GB + AWE_WINDOW_MEMORY) = 12GB - 4GB + 1GB = 9GB 이다.

(2) 8.1.7 이하에서는 AWE_WINDOW_MEMORY 최소값 제한이 없었으나,
Oracle9i R2 부터 최소값보다 작게 설정하면 DB 기동시 에러들이 발생한다.

ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS 8) Not enough storage is available to process this command


AWE_WINDOW_MEMORY 최소값 계산 공식
----------------------------------
a. MIN(AWE_WINDOW_MEMORY)= (4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8
b. _DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)
c. Max Buffer Pools = 8 (상수)
d. SETS_PER_POOL /* USE_INDIRECT_DATA_BUFFERS=TRUE 로 VLM ENABLED */
SETS_PER_POOL = 2*CPU_COUNT (if VLM is enabled)
SETS_PER_POOL = CPU Count/2 (if VLM is NOT enabled)

시나리오 #1:
----------------
# of CPU's = 8
DB_BLOCK_SIZE = 8192
Total RAM = 8GB

SETS_PER_POOL = 2 * CPU_COUNT = 16
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*16 = 128
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= (4096 * 8192 * 128) / 8 = 536870912 bytes = 512 MB


시나리오 #2:
---------------
# of CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB

SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= ( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB

주의 !!!
1. ORA-27102 는 AWE_WINDOW_MEMORY 최소값 이하일때도 발생하지만, BUFFER CACHE 가
실제 메모리보다 크게 지정된 경우에도 발생한다.
2. ORA-27102 는 DB_BLOCK_BUFFER < AWE_WINDOW_MEMORY 일때도 발생한다.
3. AWE_WINDOW_MEMORY 설정값은 "계산된 최소값 + 10 MB (overhead)" 으로 설정해야한다.
4. Hyperthreading enabled 시스템의 경우 # of CPU's 를 두배로 계산해야한다.

4. Windows 에서 Oracle 메모리 사용량 모니터링
TASK MANAGER 에서 VM 값은 정확하지 않으므로 관리도구에서 별도 모니터링해야한다.
관리도구 => Perfomance 선택 => "추가" => 성능개체:Process, Count:Virtual Bytes, Instance:oracle.exe 선택


5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

(1) Oracle 실행파일 스택 크기 조정
Thread 들이 미리 1MB 스택을 PGA 로 선점하고 필요하게 되면 더 확장해서 사용하는데
대부분들의 Thread 들은 초기 스택도 사용하지 않는 경우가 많다.
아래처럼 default=1 MB 를 500 KB로 줄일 수 있다.

. DB 내린 후 ORACLE_HOME/bin 에서 수행
C:\OH\bin> orastack oracle.exe 500000
C:\OH\bin> orastack tnslsnr.exe 500000
C:\OH\bin> orastack svrmgrl.exe 500000

(2) Shared Server (pre-Oracle9i 는 MTS 설정) 사용: 세션들이 메모리를 공유하므로 Oracle 프로세스 전체적인 메모리를 줄일 수 있다.


References
----------
Note 225349.1 - Implementing Address Windowing Extensions (AWE) or VLM on Windows Platforms
Note.205089.1 - Oracle and Hyperthreading

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
BITMAPPED INDEX  (0) 2008.08.12
REVERSE KEY INDEX  (0) 2008.08.12

+ Recent posts