收集 Teradata 中单个分区的统计信息
Posted
技术标签:
【中文标题】收集 Teradata 中单个分区的统计信息【英文标题】:Collect statistics for a single partition in Teradata 【发布时间】:2013-04-11 10:53:57 【问题描述】:我有一张表,它的一列上有主键,并按日期列分区。这是 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”分区而不是整个表的统计信息。
有没有办法收集特定日期的分区?
【问题讨论】:
【参考方案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 查询计划编辑您的原始问题,我会帮助您消化它。
【讨论】:
我们可以知道只有'2012-04-11'分区是通过手段分析的吗? (查询类型) 我们可以对每周分区使用相同的 'COLLECT STATS ON databasename.tablename COLUMN (PARTITION)' 吗? 这可以用于数据库中的任何表,无论是否分区。 'COLLECT STATS ON databasename.tablename COLUMN (PARTITION)' 将分析到目前为止加载的所有分区或仅当前日期分区。 我还在某处读到了一些建议收集分区和主索引列的统计信息,即COLLECT STATS ON DB.TABLENAME COLUMN (PARTITION,FIRST_KEY)
。可能值得调查。以上是关于收集 Teradata 中单个分区的统计信息的主要内容,如果未能解决你的问题,请参考以下文章