Oracle
表重定義後非常大的子分區
我正在嘗試重新定義要分區的表。原始表有大約 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_EXTENT
。NEXT_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;
但我建議手動指定範圍大小而不是修改隱藏參數。