로컬에서 관리되는 테이블스페이스 (LMT) I 에 이어 로컬 비트맵을 통해 테이블스페이스 공간 사용을 관리하는 새로운 테이블스페이스 관리 모드가 등장했습니다.
딕셔너리 관리 테이블스페이스 (DMT) 나중에 사용할 수 있는 테이블스페이스 관리 모드를 포함했습니다. 데이터 딕셔너리를 통해 테이블스페이스 공간 사용을 관리합니다.
테이블 세그먼트 인덱스 세그먼트 롤백 세그먼트와 같은 세그먼트 데이터베이스의 논리적 구조는 테이블스페이스에 존재하며 저장 공간에 해당합니다.
세그먼트의 스토리지는 하나 이상의 세그먼트로 나눌 수 있으며, 각 세그먼트는 일정 수의 데이터 블록을 차지합니다. 로컬에서 관리되는 테이블스페이스에서 테이블스페이스의 범위는 세그먼트의 범위 블록에 해당합니다. 이 문서에서 블록 크기는 바이트로 동의합니다.
Bit (비트) 로컬에서 테이블스페이스를 관리하는 공간 스냅인입니다. 비트는 한 간격과 같을 수도 있고, 여러 비트가 하나의 간격을 형성할 수도 있다.
로컬에서 관리되는 테이블스페이스 구문 Oracle I 릴리스에서 Oracle 은 테이블스페이스를 관리하는 새로운 방법을 도입했습니다. 로컬라이제이션 관리란 Oracle 이 더 이상 데이터 딕셔너리 테이블을 사용하여 Oracle 테이블스페이스의 영역 사용량을 기록하는 대신 각 테이블스페이스의 데이터 파일 헤더에 비트맵 영역을 추가하여 각 영역의 사용량을 기록하는 것을 의미합니다. 영역이 재사용을 위해 사용되거나 해제될 때마다 Oracle 은 데이터 파일의 시작 부분에서 레코드를 갱신하여 변경 사항을 반영합니다.
지역화된 관리 테이블스페이스를 생성하는 프로세스 구문 create tablespace tablespace name datafile details [EXTENT MANAGEMENT LOCAL {auto allocate | uniform [size intent 시스템 테이블스페이스의 경우 확장 영역 관리 로컬은 데이터베이스 생성 시 생성되는 첫번째 테이블스페이스이므로 데이터베이스 생성 시에만 지정할 수 있습니다.
I 에서 사전 관리는 여전히 기본 관리 모드입니다. LOCAL 키워드를 선택하면 로컬에서 관리되는 테이블스페이스임을 의미합니다. 물론 보다 세부적인 관리 모델을 자동 할당할지 통합 관리할지 선택할 수 있습니다. 자동 할당인 경우 Oracle 은 블록 사용 방법을 결정할 수 있습니다. 균일 을 선택한 경우 각 블록의 크기를 자세히 지정할 수도 있습니다. 지정하지 않으면 각 블록에 m 크기를 사용할 수 있습니다.
로컬에서 관리되는 이점 테이블스페이스의 현지화 관리는 데이터 딕셔너리에서 관리되는 테이블스페이스에서 자주 발생하는 반복 공간 관리 작업을 방지합니다. 테이블스페이스에서 영역 사용이 변경되면 데이터 딕셔너리의 테이블 정보도 변경되어 시스템 테이블스페이스에서도 롤백 세그먼트가 사용됩니다.
지역화된 관리 테이블스페이스는 데이터 딕셔너리의 해당 테이블에 사용 가능한 공간과 사용된 공간에 대한 정보를 쓰지 않도록 함으로써 데이터 딕셔너리 테이블의 경합을 줄이고, 공간 관리 동시 확장 영역의 현지화 관리를 향상시키고, 테이블스페이스에서 사용 가능한 블록을 자동으로 추적하며, 사용 가능한 공간을 수동으로 병합할 필요성을 줄입니다.
테이블스페이스의 영역 크기는 Oracle 시스템에 의해 결정되거나 데이터베이스 관리자가 지정하여 딕셔너리 테이블스페이스 단편화 문제를 방지할 수 있습니다.
데이터 딕셔너리를 사용하여 사용 가능한 블록 관리에서 데이터 파일의 헤더 레코드로 사용 가능한 블록 관리에 이르기까지 롤백 정보 생성을 방지하고 시스템 테이블스페이스의 롤백 세그먼트를 더 이상 사용하지 않습니다. 데이터 딕셔너리를 사용하여 관리하는 경우 데이터 딕셔너리의 테이블에 관련 정보가 기록되고 롤백 정보가 생성되기 때문입니다.
이 테이블스페이스의 이러한 특성으로 인해 하나의 테이블스페이스에서 더 많은 동시 작업을 지원하고 데이터 딕셔너리에 대한 의존도를 줄입니다.
로컬에서 관리되는 테이블스페이스 관리 방식 테이블스페이스는 세그먼트 (테이블 인덱스 등) 에 공간을 제공하는 논리적 구조입니다. ). 따라서 삭제된 세그먼트가 테이블스페이스에 추가될 때 데이터베이스는 이러한 공간의 사용량을 추적해야 합니다.
다음 예제와 같이 새로 생성된 테이블스페이스에 테이블1... 표 2 ... 표 3 ... 표 4 ... 표 5 ... 사용되지 않은 공간 등 다섯 개의 테이블이 포함되어 있다고 가정합니다. 표 4 를 삭제하면 표1... 표 2 ... 표 3 ... 여유 공간 세그먼트 ... 표 5 ... 사용되지 않은 공간. 분명히 ORACLE 은 테이블스페이스에서 이러한 할당 또는 사용되지 않은 데이터 파일 공간을 관리하는 메커니즘이 필요합니다. 할당 안 됨 및 재사용 가능) 각 공간에 대해 이 사용 가능한 공간이 어떤 데이터 파일에 있는지, 그리고 이 공간이 얼마나 큰지 알아야 합니다. 사용 중인 경우 이 공간을 차지하는 세그먼트입니다. I 까지 모든 테이블스페이스는 사전 관리 모드를 사용했습니다. 위 정보를 저장할 수 있도록 ORACLE 은 두 개의 데이터 딕셔너리 테이블 UET$ (사용된 간격) 또는 FET$ (사용 가능한 공간) SQL >: desc UET$ Name? 유형? 비어 있을 수 있는 기본 주석
SEGFILE#? 번호 세그먼트 블록 번호 내선번호? 번호 TS#? 번호 파일 # 번호 블록 # 번호 길이 번호
SQL & gtdesc FET$ Name? 유형? 비어 있을 수 있는 기본 주석
TS# 번호 파일 #? NUMBER BLOCK# NUMBER LENGTH NUMBER 질의 이 테이블에는 사용된 각 공간 또는 사용 가능한 공간 (반드시 하나의 확장 영역이 아니라 여러 확장 영역) 이 테이블의 한 행에 대응하는 것으로 표시됩니다. 세그먼트를 삭제할 때 ORACLE 이 UET$ 의 해당 행을 FET$ 로 이동하는 작동 모드입니다. 이 과정은 연속적이며 동시성이 높을 때 발생할 수 있습니다. 또 다른 문제는 테이블스페이스가 연속적이지 않거나 테이블스페이스에 많은 단편화가 있을 경우 두 테이블이 늘어나 데이터베이스 성능이 저하되는 것입니다.
테이블스페이스의 로컬 관리는 이 문제를 해결하기 위한 것입니다. 테이블스페이스의 공간 관리에서 ORACLE 은 데이터 딕셔너리가 아닌 테이블스페이스 머리의 비트맵에 저장 정보를 저장합니다. 이렇게 하면 확보 공간을 할당할 때 테이블스페이스는 다른 객체와 관련되지 않고 독립적으로 작업을 완료할 수 있습니다.
이제 로컬에서 관리되는 테이블스페이스로 들어가서 ORACLE 이 이 작업을 어떻게 수행하는지 살펴보겠습니다.
통합 모드의 로컬 관리 테이블스페이스 SQL >: create tablespace demo datafile/oradata/ltest/demo DBF size m extent 로컬 통합 크기 관리 kora 자동 세그먼트 공간의 통합 크기 관리 테이블스페이스에는 최소한 하나의 블록이 있어야 합니다. 내 실험 환경 bl 을 주목하십시오. Ock 은 k 이므로 저장 매개 변수의 initial 이 비어 있을 때 균일 크기는 최소한 k, SQL >;; 테이블스페이스 생성 데모 데이터 파일 /oradata/ltest/demo DBF 크기 m 확장 영역 관리 로컬 균일 크기 k 테이블스페이스 생성됨 SQL> 초기 확장 영역 선택/초기 확장 영역 (k)? 사용자 테이블스페이스 a 의 다음 확장 영역/다음 확장 영역 (k) 에서 테이블스페이스 이름 = 확장 영역 초기화 표시 (k) 다음 확장 영역 (k)
SQL> create table demotab (xnumber) 테이블스페이스 데모 테이블 생성됨 SQL> 테이블 이름 선택? A initial_extent/INIT_EXTENT(K)? 사용자 테이블 a 의 다음 확장 영역/다음 확장 영역 (k) 에서 테이블 이름 = 테이블 이름 초기화 확장 영역 (k)
DEMOTAB? Initial 매개변수를 저장하지 않고 테이블을 구성할 때 초기화 영역 및 다음 영역의 크기는 k 및 균일 크기와 같습니다.
SQL> 사용자 확장 영역 a 에서 바이트/초기화 확장 영역 (k) 을 선택합니다. 여기서 세그먼트 이름 = DEMOTAB, 확장 영역 id = 확장 영역 초기화 (k)
Sql> select count (*) from user _ extents where segment _ name = demotab count (*)
이 단락에서 영역이 생성되었는지 확인합니다.
초기 시간
DEMOTAB _? INIT_EXTENT 는 초기 매개변수가 아닌 SQL > > 입니다. 사용자 확장 영역 a 에서 바이트/확장 영역 초기화 (k) 를 선택합니다. 여기서 세그먼트 이름 = DEMOTAB _ 및 확장 영역 id = 확장 영역 초기화 (k)
Sql> select count (*) from user _ extents where segment _ name = demotab _ count (*)
Initial > SQL> create table demotab _ (xnumber) 테이블스페이스 프레젠테이션 저장소 (initial K next k) 테이블 생성됨 SQL> 테이블 이름 선택? A initial_extent/INIT_EXTENT(K)? 사용자 테이블 a 의 다음 확장 영역/다음 확장 영역 (k) 에서 테이블 이름 = 테이블 이름 초기화 확장 영역 (k)
DEMOTAB _ note initial > 크기가 일치할 때 초기화 영역의 크기 (initial) 입니다.
SQL> 는 사용자 확장 영역 a 에서 바이트/초기화 확장 영역 (k) 을 선택합니다. 여기서 세그먼트 이름 = DEMOTAB _ 및 확장 영역 id = 확장 영역 초기화 (k)
Sql> select count (*) from user _ extents where segment _ name = demotab _ count (*)
이때 할당된 영역은 하나가 아니라 하나라는 점에 유의하십시오. 이 경우 초기에는 효과가 있을 것입니다. 할당 영역의 수량 반올림 (초기/균일 크기)+
결론 초기 값에 관계없이 해당 세그먼트의 각 영역 크기는 균일한 크기의 크기입니다.
저장 영역 매개변수의 초기 값이 비어 있을 때 자동 할당 모드의 로컬 관리 테이블스페이스, SQL >;; 테이블스페이스 생성 demoadatafile/oradata/ltest/demoadbf sizem 확장 영역 관리 로컬 자동 할당 테이블스페이스 생성 SQL> 초기 확장 영역 선택/초기 확장 영역 선택 (k)? 사용자 테이블스페이스 a 의 다음 확장 영역/다음 확장 영역 (k) 에서 테이블스페이스 이름 = 확장 영역 초기화 표시 (k) 다음 확장 영역 (k)
SQL> 테이블 생성 demoatab(x number) 테이블스페이스 demoa 테이블 생성됨 SQL> 테이블 이름 선택? A initial_extent/INIT_EXTENT(K)? 사용자 테이블 a 의 다음 확장 영역/다음 확장 영역 (k) 여기서 a 테이블 이름 = 데모 테이블 이름 초기화 확장 영역 (k) 다음 확장 영역 (k)
Demoatab SQL> select count (*) from user _ extents where segment _ name = demoatab count (*)
SQL> segment _ name a bytes a blocks from user _ extents a 를 선택합니다. 여기서 a segment _ name = demoatab _ segment _ na? 바이트 블록
자동 할당 시 선택한 DEMOATAB_ DEMOATAB_ rows 에서 첫 번째 영역에 영역 시작 부분에 블록 (k) 이 할당되고 각 영역에 블록 (크기 m) 이 할당된 것을 발견했습니다. 나는 실험을 한 적이 있다. 초기가 충분히 크면 첫 번째 영역의 크기가 반드시 k 일 필요는 없지만 초기에는 M M M M m 또는 m 이 될 수 있습니다
DEMOATAB_? Sql> select a bytes/init _ extent (k) from user _ extents a 여기서 a segment _ name = demoatab _ and a extent
Sql> select count (*) from user _ extents where segment _ name = demoatab _ count (*)
Initial > SQL> create table demoatab _ (xnumber) 테이블스페이스 demoa storage (initial K next k) 테이블이 생성되었을 때 SQL> 가 테이블 이름을 선택했습니까? A initial_extent/INIT_EXTENT(K)? A next _ extent/next _ extent (k) from user _ tables a 여기서 a table _ name = demoatab _ table _ name? 초기 범위 (k) 다음 범위 (k)
Demoatab _ SQL> select a bytes/init _ extent (k) from user _ extents a 여기서 a segment _ name = demoatab _
Sql> select count (*) from user _ extents where segment _ name = demoatab _ count (*)
결론 서로 다른 저장 영역 매개변수를 사용자 정의할 수 있지만 ORACLE 은 로컬에서 관리되는 테이블스페이스의 모든 세그먼트 크기를 동일하게 강제합니다. 자동으로 할당된 로컬에서 관리되는 테이블스페이스에서 구획 크기는 k, m, m 또는 m 크기로 구성될 수 있지만 크기에 관계없이 공통 크기가 있으므로 k 는 테이블스페이스의 비트 크기입니다.
Uet$ 및 fet$ 에 데이터 SQL 이 있는지 확인 >; V $ datafilefile # name 에서 file # name-/oradata/ltest/datafile/o _ MF _ system _ qw _ DBE 를 선택합니다 Oradata/ltest/datafile/o _ MF _ sysaux _ q _ DBF/oradata/ltest/datafile/o _ MF _
SQL> fet 에서 count(*) 를 선택합니다. 여기서 file# = COUNT(*)
두 뷰 모두 로컬에서 관리되는 테이블스페이스를 사용하는 데이터가 없습니다. 블록 정보를 덤프하여 로컬에서 관리되는 테이블스페이스의 특성을 더 자세히 분석해 보겠습니다.
데이터 파일의 비트맵 정보 덤프 (블록 # 에서 # 까지)
덤프된 세 번째 데이터 파일의 처음 두 개는 파일 헤더이므로 덤프의 첫 번째 부분은 데이터 파일의 첫 번째 조각부터 첫 번째 블록까지의 비트맵 영역입니다. Db_block_size 가 동일하면 차지하는 공간은 k 이고 k 크기를 차지하는 문제는 덜 엄격한 또 다른 방법으로 검증됩니다.
SQL> alter system dump datafile block system altered dump 의 정보는 다음과 같습니다. startdump 블록 tsn file # min blk max blk buffer tsnrdbax (/).
Scn x ee d seq x flg x tail xee d e frmt x cval x e type x e = ktfb 비트맵 파일 공간 비트맵 블록의 16 진 덤프 st= typ_found= x EFC 에서 x F C EFC A E EE D 로 메모리 덤프? [... [……] EFC? EFC· 엡? [……] EFC ff? [... [……] EFC? [...] 반복 횟수? [...] 파일 공간 비트맵 블록 비트맵 컨트롤? 이 문장은 블록이 비트맵 영역인지 여부를 설명합니다. 블록은 모두 이와 같으며 각 블록은 검증을 덤프할 수 있습니다
Relfno begin block flag first freef f (행 * * * *)
......
블록 tsn 파일 # minblk maxblk 덤프 종료
* * * 행당 바이트, 바이트당 비트 * * * 비트 수 * * = 처음 두 단락의 내용은 f F F =>= & gtBit size 이며, 아래 user_extent 와 마찬가지로 유휴 영역이 있습니다 * * * 는 = 한 영역의 할당 크기가 블록이 아닌 경우 (예: 블록, 둘 다 같지 않음).
Visible 테이블스페이스 데모에서는 여러 영역이 사용되었습니다.
Sql> select count (*) from user _ extents a where a tablespace _ name = demo count (*)
먼저 확장한 다음 세 번째 블록 SQL> alter table demotab allocate extent table altered SQL > 를 덤프합니다 시스템 변경 덤프 데이터 파일 블록 시스템이 변경되었습니다
덤프의 정보는 startdump 블록 tsnfile # minblkmax blkbuffer tsnrdbax (/) 입니다.
Scn x fc f seq x flg x tail xfc f e frmt x cval xtype x e = ktfb 비트맵 파일 공간 비트맵 블록의 16 진 덤프 st= typ_found= x EFC 에서 x F C EFC A E FC F 로 메모리 덤프? [... o ...] EFC c c? [... [……] EFC F F f? [……] EFC ff? [... [……] EFC? [...] 반복 횟수 F BF FC F E? [... [……O] 파일 공간 비트맵 블록 비트맵 제어 RelFno BeginBlock 플래그 first free f ...
블록 tsn 파일 # minblk maxblk 덤프 종료
처음 두 섹션의 내용은 F F =>=> 1 비트입니다. 이는 alter table demotab allocate extent 문을 통해 영역 할당이 추가되었음을 나타냅니다.
블록과 같은 데이터 파일의 데이터 정보를 덤프합니다
Dba_extents 뷰를 보고 DEMOTAB 테이블이 첫번째 블록에서 첫번째 영역을 분배하는 것을 확인할 수 있습니다.
Sql> select a segment _ name a file _ id a block _ id a extent _ id from DBA _ extents a 여기서 a segment _ name = demots FILE_ID? BLOCK_ID? 범위 ID
DEMOTAB DEMOTAB?
덤프의 첫 번째 조각은 헤드 정보와 같습니다.
SQL> alter system dump datafile block system altered dump 의 정보는 다음과 같습니다. startdump 블록 tsn file # min blk max blk buffer tsnrdbax (/).
Scn x fc f seq x flg x tail xfc f frmt x cval x AAF type x = 1 차 비트맵 블록의 16 진 덤프 st= typ_found= x EFC 에서 x F C EFC A FC F 로 메모리 덤프? [... o ...] EFC AAF? EFC? [......] 시대 EFC 를 다시 읽습니까? [... [……] EFC? [... [……] EFC? [... [……] EFC? [... [……] EFC C c? [... ...] EFC a? [... [……] EFCA C? [... [……] EFCB? [... [……] EFCC CE D? EFCD? [... [……] EFCE? [... [……] EFCF? [......] 시대 EFD 를 다시 읽습니까? [... [……] EFD? [...] 반복 횟수 F BF FC F? [... o] 1 차 비트맵 블록 덤프
Nbits nranges 부모 DBA? X a? Poffset 이 포맷되지 않았습니까? 인스턴스 소유권을 가진 첫 번째 유용한 블록의 총 수가 마지막으로 성공적으로 검색되었을 때 인스턴스 소유권이 유휴 상태로 변경되었습니까? Nf? Nf? Nf? 프랑스 표준
확장 맵 블록 오프셋 첫 번째 사용 가능한 블록 비트맵 블록 잠금 opcode 잠금 xid? X c Inc # Objd HWM Flag HWM Set 고수? X c? 내선 번호? Blk#? Ext size # seg HDR 유휴 목록의 블록 수 mapblk 아래의 블록 수? X? 상쇄
데이터베이스 관리자 범위
X? 길이? 오프셋 x? 길이? 상쇄
메타데이터? 메타데이터? 메타데이터? 포맷되지 않음 포맷되지 않음? 포맷되지 않았습니까? 포맷되지 않았습니까? 포맷되지 않음 포맷되지 않음? 포맷되지 않았습니까? 포맷되지 않았습니까? 포맷되지 않음 포맷되지 않음? 포맷되지 않았습니까? 포맷되지 않았습니까? 형식이 없는
Lishi Xinzhi/article/program/Oracle/201311//kloc-