2013-10-17 4 views
7

우리는 Oracle 10G를 사용하고 있으며 데이터를 쿼리/삭제하면 테이블 중 하나에 많은 시간이 걸립니다. 이 표에는 약 1 천만 개의 레코드가 들어 있습니다. Oracle 10g에서 ROW_MOVEMENT를 활성화/비활성화 할 때의 영향은 무엇입니까?

최근에 우리가 ROW_MOVEMENT이 테이블에 사용할 수 없습니다 것을 발견, 우리는 다음과 같은 이해하려면 :

  1. ROW_MOVEMENT을 사용하는 경우 어떤 성능 이득을 우리가받을 수 있나요?
  2. ROW_MOVEMENT를 사용할 수있는 단점이 있습니까?
  3. 트리거의 행 이동은 무엇입니까? 오라클이 ROWS를 이동해야한다고 어떻게 결정합니까?

도움을 주시면 감사하겠습니다.

미리 감사드립니다.

답변

8

행 이동은 주로 applied to partition tables입니다. 행을 파티션간에 이동할 수 있습니다. 당신이 행 이동을 허용하면

SQL> CREATE TABLE part_table (ID NUMBER) 
    2 PARTITION BY RANGE (ID) 
    3  (PARTITION p0 VALUES LESS THAN (1), 
    4  PARTITION p1 VALUES LESS THAN (MAXVALUE)); 

Table created 

SQL> INSERT INTO part_table VALUES (0); 

1 row inserted 

SQL> UPDATE part_table SET ID = 2; 

UPDATE part_table SET ID = 2 

ORA-14402: updating partition key column would cause a partition change 

, 당신은 업데이트 행을 이동할 수 있습니다 :

SQL> ALTER TABLE part_table ENABLE ROW MOVEMENT; 

Table altered 

SQL> UPDATE part_table SET ID = 2; 

1 row updated 

이를 행 운동이 비활성화로, 기본이되는, 당신은 업데이트 행을 이동할 수 없습니다 기능은 대부분의 경우 성능에 영향을 미치지 않습니다. 기능이 활성화되어 있는지 여부에 상관없이 행이 정확히 동일한 방식으로 저장되고 쿼리됩니다. 그러나 행 이동이 활성화되면, 행은 실제로 예를 들어 ALTER TABLE SHRINK SPACE으로 물리적으로 이동 (delete + insert와 유사) 될 수 있습니다. 이 경우은 예를 들어 인덱스 클러스터 요소에 영향을 줄 수 있으며 이는 일부 쿼리의 성능에 영향을 미칠 수 있습니다.

행 이동은 행의 rowid이 변경 될 수 있음을 의미하기 때문에 기본적으로 사용되지 않습니다. 이는 Oracle에서 일반적인 동작이 아닙니다.

+2

행 이동을 사용하면 alter table shrink space를 쉽게 실행할 수 있으며 경우에 따라 다시 작성하지 않고 테이블 크기를 줄일 수 있습니다. –

+0

고마워요 !! 그래서 우리가 그것을 가능하게하더라도 쿼리는 여전히 같은 시간이 걸릴 것입니다. 나는 약간 성과 개선을 예상하고 있었다. –

+0

행 이동은 성능에 영향을 미칠 수 있습니다. 인덱스 쿼리에는 추가 I/O 작업이 많이 필요할 수 있습니다. 또한 여기에서 읽을 수 있습니다. http://www.dba-oracle.com/t_enable_row_movement.htm –

1

또한 다음 작업 http://www.dba-oracle.com/t_callan_oracle_row_movement.htm

ROW 이동이 필요한 참조 정상

  • 이동 파티션 사이 행 (분할 된 테이블)
  • 이 테이블을 (콤팩트 캐스케이드 수축 테이블
  • 플래시백,)

질문에 대한 답변 : 없음 행 이동을 사용 가능하게하면 성능이 향상되지만 테이블을 축소하여 전체 테이블 조회에 대한 성능을 향상시킬 수 있습니다.

ASKTOM는 질문에 아주 좋은 답변을 제공 : (ROW의 움직임을 필요로) 수축에 관한

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:35203106066718

:

내가 벤치마킹을 제안

- [정보 수집 성능 메트릭 테이블 작업을 수행하기 전과 후에. 스캔이 더 효율적으로 수행되기를 기대한다면, 블록이 병합되어 (데이터가 분산되지 않음) 더 많은 행이있을 때 인덱스 범위 스캔이 변경되지 않았거나 "더 좋음"을 기대하게됩니다. STATSPACK 또는 dbconsole에서 사용할 수있는 도구가 이 (시간이 지남에 따라 쿼리 수행 한 작업의 양)

1

행 운동의 단점이 있다는 것입니다 측정에 유용 할 것이다 - 당신은 일어날 찾고있을 것 ROWID이 변경 될 수 있습니다. 따라서 ROWID을 기반으로하는 쿼리가있는 경우 잘못된 결과가 반환 될 수 있습니다.

+0

지식 기반에 또 다른 좋은 점을 추가해 주셔서 감사합니다. –

관련 문제