分割槽表部分分割槽不可用導致統計資訊收集失效的問題

2022-04-05 16:24:52 字數 2506 閱讀 8380

分割槽表部分分割槽不可用導致統計資訊收集失效的問題

乙個客戶碰到的具體需求,分割槽表中有些分割槽所在的表空間被offline,tb導致在刪除統計資訊時報錯。

下面通過例子來說明這個問題:

www.2cto.com  

sql> create table t_part_read (id number)

2 partition by range (id)

3 (partition p1 values less than (10) tablespace ts1, 

4 partition p2 values less than (20) tablespace ts2, 

5 partition pmax values less than (maxvalue) tablespace users);

table created.

sql> insert into t_part_read select rownum from tab;

54 rows created.

sql> commit;

commit complete.

sql> exec dbms_stats.gather_table_stats(user, 't_part_read')

pl/sql procedure successfully completed.

sql> alter tablespace ts1 read only;

tablespace altered.

sql> exec dbms_stats.gather_table_stats(user, 't_part_read')

pl/sql procedure successfully completed.

sql> alter tablespace ts1 offline;

www.2cto.com  

tablespace altered.

sql> exec dbms_stats.gather_table_stats(user, 't_part_read')

begin dbms_stats.gather_table_stats(user, 't_part_read'); end; *

error at line 1:

ora-00376: file 6 cannot be read at this time

ora-01110: data file 6: '/u01/app/oracle/oradata/orcl/datafile/o1_mf_ts1_7w8l5fz1_.dbf'

ora-06512: at "sys.dbms_stats", line 23829

ora-06512: at "sys.dbms_stats", line 23880

ora-06512: at line 1

如果將表空間唯讀,並不會影響到表空間上的表或分割槽的統計資訊的收集,因為收集過程只是讀取,而收集的結果資訊是寫到system表空間的。

但是如果分割槽所在的表空間處於offline狀態,那麼在統計資訊收集的過程中就會報錯。

有乙個很簡單的方法可以解決這個問題,就是將被offline影響的分割槽的統計資訊鎖定,這樣oracle在收集統計資訊時就會跳過鎖定的分割槽,通過這個辦法就可以避免統計資訊收集過程中的報錯:

sql> exec dbms_stats.lock_partition_stats(user, 't_part_read', 'p1')

www.2cto.com  

pl/sql procedure successfully completed.

sql> exec dbms_stats.gather_table_stats(user, 't_part_read')

begin dbms_stats.gather_table_stats(user, 't_part_read'); end; *

error at line 1:

ora-00376: file 6 cannot be read at this time

ora-01110: data file 6: '/u01/app/oracle/oradata/orcl/datafile/o1_mf_ts1_7w8l5fz1_.dbf'

ora-06512: at "sys.dbms_stats", line 23829

ora-06512: at "sys.dbms_stats", line 23880

ora-06512: at line 1  www.2cto.com  

sql> exec dbms_stats.gather_table_stats(user, 't_part_read', granularity => 'partition')

pl/sql procedure successfully completed.

即使鎖定分割槽後,嘗試收集統計資訊仍然報錯,這是因為oracle預設除了要收集分割槽上的統計資訊以外,還要收集表級的統計資訊,而這就會造成被offline影響的分割槽也要被讀取。

解決方法就是在收集統計資訊的時候指定收集的粒度是分割槽,不收集表上的global資訊。

把非分割槽表改為分割槽表

把非分割槽表改為分割槽表 說明 把非分割槽表改為分割槽表適用於歷史表 1 建立分割槽表 結構和非分割槽表tbl stock balance log相同 createtabletbl stock balance log part1 account id varchar2 20 byte occur d...

MySQL分割槽表 hash分割槽

雜湊分割槽最主要的用法是用來保證資料的平均分布。使用範圍分割槽和列表分割槽時必須顯示地定義分割槽值或者值列表 但是使用雜湊分割槽時,我們只需要對列值或者基於列值的表示式進行雜湊運算,就可以進行分割槽了。在進行雜湊分割槽是,我們需要在create table語句後加上partition by hash...

ORACLE 分割槽表分割槽拆分

oracle建立分割槽表,分割槽規則為按照日期進行分割槽,由於投產日期未知,因此建議使用按照當前日期自動建立分割槽。僅需建立乙個max分割槽,然後通過split進行分割槽拆分,建立一年前的全部分割槽。示例 如下 create table wen dt decimal 8,0 id decimal 1...