1

我有一个表,它在一列上有主键,并按日期列分区。这是 DDL 的示例格式:

CREATE MULTISET TABLE DB.TABLE_NAME,
NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(  FIRST_KEY                 DECIMAL(20,0) NOT NULL,
   SECOND_KEY                DECIMAL(20,0) ,
   THIRD_COLUMN              VARCHAR(5),     
   DAY_DT                    DATE FORMAT 'YYYY-MM-DD')
PRIMARY INDEX TABLE_NAME_IDX_PR (FIRST_KEY)
PARTITION BY RANGE_N(DAY_DT  BETWEEN DATE '2007-01-06' 
                                 AND DATE '2016-01-02' EACH  INTERVAL '1' DAY );

COLLECT STATS ON DB.TABLE_NAME COLUMN(FIRST_KEY);

传入的数据每天可以达到 3000 万,我已经加载了 2012-04-11 的数据。现在我必须只收集“2012-04-11”分区而不是整个表的统计信息。

有没有办法收集特定日期的分区?

4

1 回答 1

1

您可以简单地收集系统列的统计信息PARTITION,它应该更新与分区列相关的直方图。

COLLECT STATS ON {databasename}.{tablename} COLUMN (PARTITION);

这可以在分区表和非分区表上收集。它有助于提供表和分区(如果存在)的优化器基数。它将更新表上所有分区的统计信息。在 PARTITION 列上收集统计信息是一个 CPU 成本低、挂钟时间短的过程。它比在物理列或整个表上收集统计信息要便宜得多。(即使对于具有数百万、数千万或更多记录的表。)

如果要确定优化器是否识别刷新的统计信息,从 TD 13.10 开始没有直接的方法(不确定 TD 14.x)。但是,如果您在查询上运行 EXPLAIN,您可以判断优化器是否对包含针对分区列的条件的步骤有很高的信心。如果您指定单个日期,例如DATE '2012-04-11'您应该在 EXPLAIN 中看到分区消除已发生在单个分区上。

如果您在消化 EXPLAIN 方面需要帮助,请使用 EXPLAIN 查询计划编辑您的原始问题,我将帮助您消化它。

于 2013-04-11T14:40:28.360 回答