2013-11-25 3 views
2

행 조각화는 테이블 열에 char/varchar2 데이터 형식을 선택할 때 항상 고려해야 할 사항이었습니다. 오라클이 열린 공간에 새로운 데이터를 넣으려고하고 조각화가 시작될 수 있기 때문에 테이블에서 일괄 삭제/삽입/업데이트를 실행해야했습니다. 성능을 약간 느려지 게합니다. 이제는 플래시 기술로 인해 데이터가 가능한 한 많이 파편화되기 때문에 플래시 스토리지 디스크로 모든 것이 바뀌 었습니다. 단편화에 신경 쓸 필요가 없다면 테이블 데이터 저장 문제와 데이터 단편화에 대한 전체적인 이해를 깨뜨릴 수 있습니다. 누구든지 플래시 스토리지 디스크에 데이터베이스 파일을 저장하는 경험이 있습니까? 단편화 문제가 ssd 디스크에서 사라 졌습니까?플래시 디스크 스토리지를 사용할 때 여전히 행 조각화에 대해 걱정할 필요가 있습니까?

답변

4

설명하는대로 "행 조각화"와 같은 것이없고 실제로는 char 또는 varchar2 데이터 유형 중에서 선택해서는 안됩니다. 선택한 데이터 유형은 데이터의 특성과 실제로 고정 너비인지 가변 폭인지에 따라 달라집니다. 시간의 99.9 %는 varchar2을 선호합니다.

Oracle에서 입출력이 가능한 최소 단위는 읽거나 쓸 수있는 블록입니다. 블록은 일반적으로 8k입니다 (2k 또는 32k만큼 작을 수도 있음). 블록은 일반적으로 여러 행에 대한 데이터를 저장합니다. 오라클은 매번 전체 블록을 작성해야하므로 블록 내에서 데이터를 이동해야하는지 여부는 중요하지 않습니다.

블록 내에서 오라클은 향후 확장을 위해 일정한 공간을 확보합니다. 이 값은 테이블의 PCTFREE 설정에 의해 제어됩니다. 시간 경과에 따라 행 수가 크게 늘어날 것으로 예상되는 경우 큰 PCTFREE을 사용하십시오. 시간 경과에 따라 행의 크기가 고정 될 것으로 예상되는 경우 작은 PCTFREE을 사용하십시오. 행의 크기가 변경되지 않도록 데이터 유형을 조정하지 않으려는 경우 테이블의 PCTFREE을 원하는대로 변경하여 조정할 수 있습니다.

특정 행에 대한 블록의 공간이 부족한 경우 (예 : 행을 확장해야하고 PCTFREE을 너무 작게 설정 한 경우) Oracle은 행을 새 블록으로 마이그레이션해야합니다. 즉, 원래 블록에 새 블록을 가리키는 포인터를두고 실제 데이터를 새 블록으로 이동시킵니다. 이전 테이블과 새 블록을 방문하여 테이블의 일부 행이 마이그레이션되는 경우 인덱스를 읽는 경우 행을 읽어야하므로 성능 문제가 발생할 수 있습니다. 오라클이 추가 I/O를 수행하도록 강요하는 255 개 이상의 컬럼을 가진 블록 또는 로우보다 큰 행을 갖고 있지만 여기에 우려되는 것처럼 보이지 않는다면 체인화 된 행의 문제를 얻을 수도 있습니다 .

스토리지 시스템에 관계없이 테이블의 PCTFREE을 적절하게 설정하여 시간이 지남에 따라 발생하는 행 마이그레이션 양을 최소화 할 수 있습니다 (일부 모서리의 경우 행 마이그레이션을 최소화하는 다른 방법이 있지만 99 % 당신이 정말로 단지 PCTFREE을 정확하게 설정하고 싶을 때). 저장하려는 데이터에 적절한 데이터 유형을 사용하십시오. 행 마이그레이션이 데이터 유형 선택에 영향을 미치지 않도록하십시오.

+0

ASSM (Automatic Segment Storage Management)이 자동으로 PCTFREE를 관리하므로 이전 유형의 MSSM 저장소 유형을 사용할 때 PCTFREE를 설정해야합니까? – Centurion

+1

@Centurion - 아니요. ASSM은 수동 세그먼트 공간 관리에서 'PCTUSED'매개 변수에 의해 처리 된 것을 자동으로 처리합니다. 두 유형의 테이블 공간 모두 테이블의'PCTFREE' 설정에 의존합니다. 시스템이 행의 크기가 시간이 지남에 따라 어떻게 변할지를 알 수있는 방법이 없기 때문에 'PCTFREE'를 자동으로 관리하는 것은 매우 어려울 것입니다. 이것은 데이터 모델러 만 처음에 알고있는 것입니다. –

관련 문제