Oracle 표 파편 정리 작업 절차 상세 설명

8451 단어 Oracle조각 정리
높 은 수위 선(HWL)아래 의 많은 데이터 블록 은 모두 데이터 가 없 지만,전체 표 는 스 캔 할 때 높 은 수위 선의 데이터 블록 을 스 캔 해 야 한다.즉,Oacle 은 많은 헛 된 일 을 해 야 한 다 는 것 이다!그래서 Oacle 은 shrink space 파편 정리 기능 을 제공 합 니 다.색인 에 대해 서 는 rebuild online 방식 으로 조각 정 리 를 할 수 있 습 니 다.일반적으로 DML 작업 을 자주 하 는 대상 DBA 는 정기 적 으로 유지 하 는 동시에 통계 정 보 를 제때에 업데이트 하 는 것 에 주의해 야 합 니 다!1.테스트 데 이 터 를 준비 하고 HR 사용 자 를 사용 하여 T1 표를 만 들 고 약 30W 의 데 이 터 를 삽입 하 며 object 에 따라id 일반 인덱스 생 성,테이블 저장 공간 34M 차지

SQL> conn /as sysdba

SQL> select default_tablespace from dba_users where username='HR';

DEFAULT_TABLESPACE
------------------------------------------------------------
USERS

SQL> conn hr/hr


SQL> insert into t1 select * from t1;
74812 。

SQL> insert into t1 select * from t1;
149624 。

SQL> commit;


SQL> create index idx_t1_id on t1(object_id);


SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 。

SQL> select count(1) from t1;

  COUNT(1)
----------
    299248

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';
SUM(BYTES)/1024/1024
--------------------
             34.0625

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='IDX_T1_ID';
SUM(BYTES)/1024/1024
--------------------
                   6
2.높 은 수위 에서 사용 할 수 있 는 공간 이 얼마나 있 는 지 추산 합 니 다.이 수 치 는 낮 을 수록 좋 습 니 다.표 의 사용률 이 높 은 수위 선 에 가 까 울 수록 전체 표 스 캔 이 하 는 노력 도 적 습 니 다!DBMS_STATS 패키지 EMPTY 획득 불가BLOCKS 는 정 보 를 집계 하기 때문에 analysis 명령 으로 통계 정 보 를 한 번 더 수집 해 야 합 니 다.

SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
      4302            0     299248

SQL> analyze table t1 compute statistics;


SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
      4302           50     299248

SQL> col table_name for a20
SQL> SELECT TABLE_NAME,
  2         (BLOCKS * 8192 / 1024 / 1024) -
  3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
  4    FROM USER_TABLES
  5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB
-------------------- -------------------------
T1                                  5.07086182
3.실행 계획 을 살 펴 보면 전체 표 스 캔 은 CPU 1175 를 소모 해 야 합 니 다.

SQL> explain plan for select * from t1;


SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   299K|    28M|  1175   (1)| 00:00:15 |
|   1 |  TABLE ACCESS FULL| T1   |   299K|    28M|  1175   (1)| 00:00:15 |
--------------------------------------------------------------------------
4.대부분의 데 이 터 를 삭제 하고 통계 정 보 를 수집 하 며 전체 표 스 캔 은 CPU 1168 을 소모 해 야 합 니 다.

SQL> delete from t1 where object_id>100;
298852 。

SQL> commit;


SQL> select count(*) from t1;

  COUNT(*)
----------
       396

SQL>  exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 。

SQL> analyze table t1 compute statistics;


SQL> SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
      4302           50        396

 
SQL> explain plan for select * from t1;


SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   396 | 29700 |  1168   (1)| 00:00:15 |
|   1 |  TABLE ACCESS FULL| T1   |   396 | 29700 |  1168   (1)| 00:00:15 |
--------------------------------------------------------------------------
5.높 은 수위 에서 데이터 가 없 는 공간 이 얼마나 있 는 지 추산 표 는 스 캔 할 때 또 헛 된 데 이 터 를 해 야 한다.

SQL> SELECT TABLE_NAME,
  2         (BLOCKS * 8192 / 1024 / 1024) -
  3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
  4    FROM USER_TABLES
  5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB
-------------------- -------------------------
T1                                  33.5791626
6.시 계 를 조각 정리 하고 통계 정 보 를 다시 수집한다.

SQL> alter table t1 enable row movement;


SQL> alter table t1 shrink space cascade;


SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';

SUM(BYTES)/1024/1024
--------------------
                .125

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='IDX_T1_ID
';

SUM(BYTES)/1024/1024
--------------------
               .0625

SQL> SELECT TABLE_NAME,
  2         (BLOCKS * 8192 / 1024 / 1024) -
  3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
  4    FROM USER_TABLES
  5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB
-------------------- -------------------------
T1                                  33.5791626

SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 。

, 0.1M , , CPU 3
SQL> SELECT TABLE_NAME,
  2         (BLOCKS * 8192 / 1024 / 1024) -
  3         (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
  4    FROM USER_TABLES
  5   WHERE table_name = 'T1';

TABLE_NAME           Data lower than HWM in MB
-------------------- -------------------------
T1                                  .010738373

 
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   396 | 29700 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |   396 | 29700 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

5 , 50 , empty_blocks
SQL> select blocks,empty_blocks,num_rows from user_tables where table_name='T1';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5           50        396

SQL> analyze table t1 compute statistics;


SQL> select blocks,empty_blocks,num_rows from user_tables where table_name='T1';

 
    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
         5            3        396

좋은 웹페이지 즐겨찾기