2017-04-04 151 views
0

有一個表可以通過並行運行的多個批次進行更新。即 - 應用程序運行分析,該分析具有分析ID和 - 此分析批量插入數據到「ANALYSIS_TABLE」表中並且每批都有一個批處理ID 我需要收集此表上的統計信息「ANALYSIS_TABLE 「每批完成時。收集有關Oracle中子分區表的統計信息

表中的結構是:

 
Analysis_id | Batch_id | Analysis_Val | Specific_key | 
----------- | ------ | ------------ | ------------ 
A1   | B1 |  2.0  |  A1-B1 | 
A1   | B1 |  5.0  |  A1-B1 | 

我需要調用收集等, 呼叫pack_stats.gather_table_stats( 'ANALYSIS_TABLE', 'A1-B1'),

call pack_stats.gather_table_stats('ANALYSIS_TABLE','A1-B2') (*if it has a 
value for specific_key column like 'A1-B2'*) 

and so on. 

統計但是當我打電話給這個時,oracle並沒有識別出鍵'A1-B1','A1-B2'等。

表'ANALYSIS_TABLE'是一個子分區表。 執行下面的查詢顯示了其在「Specific_key」列沒有關係的數據subpartition_key:

*select table_name, partition_name,subpartition_name, last_analyzed, 
num_rows from user_tab_statistics where table_name='ANALYSIS_TABLE' and 
partition_name='P000000000563'* 
 
Table_name | partition_name | subpartition_name | last_analyzed | num_rows| 
--------------| -------------- | ----------------- | ------------- | -------- 
ANALYSIS_TABLE | P000000000563 | (null)    | 04-Apr-17  | 2 | 
ANALYSIS_TABLE | P000000000563 | P000000000563_null | 04-Apr-17  | 0 | 
ANALYSIS_TABLE | P000000000563 | P000000000563_DEFAULT| 04-Apr-17  | 2 | 

我怎樣才能確保在我的第一臺「specific_key」列中的值反映在user_tab_statistics的subpartition_name列中?

或更確切地說,如何在'specific_key'列和subpartition_name列之間建立關係。

如我剛纔提到的那樣,每個批次收集統計數據的其他想法也是受歡迎的。

謝謝!

回答

0

的直線前進的方法是這樣的:

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, HIGH_VALUE 
FROM USER_TAB_SUBPARTITIONS 
WHERE TABLE_NAME = 'ANALYSIS_TABLE' 
    AND PARTITION_NAME = 'P000000000563' 
    AND HIGH_VALUE = 'A1-B2'; 

然而,你會得到一個

ORA-00997:非法使用LONG數據類型的

LONG數據類型不推薦使用它,但甲骨文自己使用它很多!

一種解決方法是這樣的一個:

DECLARE 

    KeyValue ANALYSIS_TABLE.Specific_key%TYPE; 

    CURSOR TabSubPartitions IS 
    SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, HIGH_VALUE 
    FROM USER_TAB_SUBPARTITIONS 
    WHERE TABLE_NAME = 'ANALYSIS_TABLE' 
     AND PARTITION_NAME = 'P000000000563'; 

BEGIN 
    FOR aSubPart IN TabSubPartitions LOOP 
     EXECUTE IMMEDIATE 'BEGIN :ret := '||aSubPart.HIGH_VALUE||'; END;' USING OUT KeyValue; 
     IF KeyValue = 'A1-B1' THEN 
      DBMS_STATS.GATHER_TABLE_STATS(USER, 'ANALYSIS_TABLE', aSubPart.SUBPARTITION_NAME); 
     END IF;  
    END LOOP; 
END;