Oracle

表重定義後非常大的子分區

  • March 8, 2016

我正在嘗試重新定義要分區的表。原始表有大約 1.5M 行和大約 150MB 大小。

select segment_type, segment_name, bytes / 1014 / 1024 as SIZE_MB from user_segments where segment_type = 'TABLE' and segment_name = 'WERTEVAR';

segment_type | segment_name | SIZE_MB
TABLE          WERTEVAR       153.543.......

我做了什麼:

CREATE TABLE WERTEVAR_TMP(
 ...column definitions
)
TABLESPACE "USERS"
PARTITION BY RANGE (WVDATZEIT) INTERVAL (NUMTODSINTERVAL(1, 'day'))
SUBPARTITION BY HASH (WVTEIL, WVMASCHINE) SUBPARTITIONS 8
(
   PARTITION P_BEFORE_2000 VALUES LESS THAN (TO_DATE('01-01-2000',     'DD-MM-YYYY'))
);

BEGIN
   DBMS_REDEFINITION.start_redef_table(
       uname         => 'CHYSTAT_STAGING_MONITORING',
       orig_table    => 'WERTEVAR',
       int_table     => 'WERTEVAR_TMP',
       options_flag  => DBMS_REDEFINITION.CONS_USE_ROWID
   );
END;

SET SERVEROUTPUT ON
DECLARE
   l_errors  NUMBER;
BEGIN
   DBMS_REDEFINITION.copy_table_dependents(
       uname            => 'CHYSTAT_STAGING_MONITORING',
       orig_table       => 'WERTEVAR',
       int_table        => 'WERTEVAR_TMP',
       copy_indexes     => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
       copy_triggers    => TRUE,
       copy_constraints => TRUE,
       copy_privileges  => TRUE,
       ignore_errors    => FALSE,
       num_errors       => l_errors,
       copy_statistics  => FALSE,
       copy_mvlog       => FALSE
   );

   DBMS_OUTPUT.put_line('Errors=' || l_errors);
END;

-- Complete the redefinition process
BEGIN
   DBMS_REDEFINITION.finish_redef_table(
   uname      => 'CHYSTAT_STAGING_MONITORING',
   orig_table => 'WERTEVAR',
   int_table  => 'WERTEVAR_TMP');
END;

DROP TABLE WERTEVAR_TMP;

現在,當我查看表大小時,它變得非常大:大約 23GB!

select segment_type, segment_name, sum(bytes) / 1014 / 1024 as SIZE_MB from user_segments where segment_name = 'WERTEVAR' group by segment_type, segment_name;

segment_type       | segment_name | SIZE_MB
TABLE SUBPARTITION   WERTEVAR       23525.743.......

我可以看到每個子分區正好有 8M。我有什麼問題嗎?這些子分區應該像這樣大嗎?

我還可以看到這些子分區已設置:

  • PCT_FREE = 10
  • INITIAL_EXTENT = 8388608
  • NEXT_EXTENT = 1048576

我會將其更改為小兩個數量級INITIAL_EXTENTNEXT_EXTENT像 83886 和 10485 之類的東西。但我不知道這是否可以,或者完全沒用。

我會很感激任何提示。

是的,這是反復出現的問題。從 11.2.0.2 開始,分區的預設段大小從 64K 增加到 8M。這意味著,即使您的分區是空的,它仍然會在創建後立即消耗 8 MB 空間。

升級到 11.2.0.2 或更高版本後,分區的初始範圍大小從 64KB 更改為 8MB(文件 ID 1295484.1)

您應該在創建新表時指定您提到的參數,例如:INITIAL EXTENT 65536 NEXT EXTENT 65536

或者,您可以設置一個隱藏參數,以便數據庫恢復到舊的行為、會話或數據庫級別:

alter session set "_partition_large_extents" = false;
alter system set "_partition_large_extents" = false;

但我建議手動指定範圍大小而不是修改隱藏參數。

引用自:https://dba.stackexchange.com/questions/131580