teradata 使用样本收集统计数据不太有效

Posted

技术标签:

【中文标题】teradata 使用样本收集统计数据不太有效【英文标题】:teradata collect stats using sample doesnt quite work 【发布时间】:2016-03-30 10:56:35 【问题描述】:

试图在VT 上收集样本 2 pct 多列统计信息 问题是,它没有采样或者我遗漏了一些东西

COLLECT STATISTICS USING sample 2 percent 
        COLUMN ( C1,C2,C3) , 
        COLUMN ( C1 ) on vt  , 

易失性表 VT 有几十亿行,收集 VT 上的统计信息所花费的“永远”时间与收集常规统计信息所需的时间一样多。 同样在其他地方,在过去类似的情况下,我观​​察到如果我使用“新”(一个多列)统计集合语法,它会采样第一个列并忽略其余部分(现在这第二部分是t 一直经过验证,因为我更多地基于“花费时间”的预感而不是窥视历史。)

    show  stats values  
            COLUMN ( C1,C2,C3 ) , 
            COLUMN ( C1 )  on vt;

COLLECT STATISTICS 
            COLUMN ( C1,C2,C3 )
                ON  vt 
            VALUES
(
 /** SummaryInfo **/ 
 /* Data Type and Length: 'I8:8', 'I:4', 'CF:1' */
 /* TimeStamp             */ TIMESTAMP '2016-03-29 16:16:13-00:00', 
 /* Version               */ 6, 
 /* OriginalVersion       */ 6, 
 /* DBSVersion            */ '14.00.00', 
 /* UsageType             */ 'D', 
 /* ComplexStatInfo       */ 'ComplexStatInfo', 
 /* NumOfBiasedValues     */ 0, 
 /* NumOfEHIntervals      */ 200, 
 /* NumOfHistoryRecords   */ 1, 
 /* SamplePercent         */ 0.00, 
 /* NumOfNulls            */ 0, 
 /* NumOfAllNulls         */ 0, 
 /* NumOfPartialNullVals  */ 0, 
 /* PartialNullHMF        */ 0, 
 /* AvgAmpRPV             */ 0.000000, 
 /* MinVal                */ 2012070201942549261, 221945585, 'P', 
 /* MaxVal                */ 2014022922306867633, 277308727, 'P', 
 /* ModeVal               */ 2012070201942549261, 221945585, 'P', 
 /* HighModeFreq          */ 1, 
 /* NumOfDistinctVals     */ 1201056221, 
 /* NumOfRows             */ 1201056221, 
 /* CPUUsage              */ 0.000000, 
 /* IOUsage               */ 0.000000, 
 /* Reserved              */ 0, 
 /* Reserved              */ 0, 
 /* Reserved              */ 0.000000, 
 /* Reserved              */ 0.000000, 
 /* Reserved              */ '', 
 /* StatsSkipCount        */ 0, 
 /* SysInsertCnt          */ 0, 
 /* SysDeleteCnt          */ 0, 
 /* SysUpdateCnt          */ 0, 
 /* SysInsDelLastResetTS  */ TIMESTAMP '9999-12-31 23:59:59-00:00', 
 /* SysUpdLastResetTS     */ TIMESTAMP '9999-12-31 23:59:59-00:00', 
 /* IsSampleFollowingTrend*/ 0, 
 /** Interval: MaxVal[3], ModeVal[3], ModeFreq, LowFreq, OtherVals, OtherRows **/ 

这里

/* SamplePercent */ 0.00, 就是我要去的地方。我确定我错过了一些东西。

【问题讨论】:

【参考方案1】:

/* DBSVersion */ '14.00.00', 正确吗?您似乎运行了一个非常旧的版本,这是 TD Express 吗?

好吧,如果你有一个 5,000,000,000 行的表,这个/* NumOfRows */ 1201056221, 似乎表示大约。 25%,这也很奇怪。

如果您解释您的COLLECT STATS,您可以查看它是否真的在采样。

可以添加表的 DDL 吗?

【讨论】:

你好迪特.TY。很抱歉,我可能对 50 亿听起来有误导性——我的意思是 (*) 以十亿为单位(就像传送一张巨大的桌子一样)并且没有注意细节。更正了 Q 。我认为这是因为我用 stats 复制了 VT。这些都是陈旧的统计数据。所以我可能不得不放弃它们才能让采样工作?我确实解释了 collect stats 。听起来它不想采样。因此,如果 VT 上存在 Full stats,则无法在第二次运行时进行采样。为了使抽样工作 - 你必须放弃完整的统计数据?再次TY @user1874594:由于 TD14 统计信息收集过程会记住 SAMPLE 设置,因此当您收集一次 USING SAMPLE 2 PERCENT 时,即使您没有指定它,下一次重新收集也会保留该样本。只需运行解释。 @user1874594:我刚刚尝试过,看起来SAMPLE 不适用于易失性表,不知道这是否记录在案(至少我还没有看到) .你最好在 DevEx 上询问 Carrie Ballinger:developer.teradata.com/blog/carrie/2014/09/… 更新的原始评论:TY..bummer on that .... 那么,我该如何解决?我认为从原始表创建 VT,将sample 过滤以限制大小-收集我想要的所有统计信息,然后截断表(保留统计信息)-然后完全插入(有更好的方法来处理这个吗?)。问题是即使在我收集了优化器想要的所有统计信息但样本不是完整的统计信息之后 - 它不会改变解释计划。它仍然想继续做那些散列连接(优化器迷上了散列连接 hashish :)! )。 TY 再次反应灵敏 它要求组合统计数据,有些是 99% 偏斜的,但我在解释中没有看到任何偏斜的行处理。这些也是中等置信度组合统计数据。在我收集样本后——它们并没有从解释中消失——仍然继续在解释中询问。所以我想知道有多少从 VT 收集的统计数据(尤其是样本)被优化器认真对待。

以上是关于teradata 使用样本收集统计数据不太有效的主要内容,如果未能解决你的问题,请参考以下文章

收集 Teradata 中单个分区的统计信息

GWAS研究中样本数量和结果真实有效性之间是怎样的?

异常检测——基于概率统计的异常检测

什么是推理统计(inferential statistics)?

如何统计样本量的power

统计思维:程序员数学之概率统计