在Oracle中的子分区表上收集统计信息

时间:2017-04-04 22:26:21

标签: sql oracle stored-procedures

有一个表由多个并行运行的批次更新。即,    - 应用程序运行分析,其中包含分析ID和    - 此分析将数据插入表格中,即“分析有效”和“#34;分批和    - 每个批次都有一个批次ID 我需要收集这张桌子上的统计数据" ANALYSIS_TABLE"当每批完成时。

表的结构是:

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'等

表格&----39; ANALYSIS_TABLE'是一个子分区表。 执行以下查询显示subpartition_key,它与< Specific_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_key'中的值?我的第一个表中的列反映在user_tab_statistics?

的subpartition_name列中

或者更确切地说如何在" specific_key'之间建立关系。 column和subpartition_name列。

我也欢迎任何关于收集每批产品统计数据的其他想法。

谢谢!

1 个答案:

答案 0 :(得分: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数据类型已弃用多年,但Oracle本身也在使用它!

解决方法就是这个:

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;