在Teradata中使用COLLECT STATISTICS

Chr*_*amp 8 sql database query-optimization teradata

在Teradata我可以使用像...这样的声明

collect statistics on my_table column(col1)
Run Code Online (Sandbox Code Playgroud)

这将收集表上的统计信息并将它们存储在DBC视图中,如ColumnStats,IndexStats和MultiColumnStats.我也认为优化器(解析引擎)会在可用时找到统计信息,并使用它们而不是估计的基数/索引值计数来更好地决定如何执行查询.

这听起来很棒,但我有一些问题.

  • 使用有什么不利之处collect stats吗?
  • 何时在SQL脚本中使用收集统计信息是否合适/不合适?
  • 收集已编入索引的字段的统计信息的性能优势是什么?
  • 统计信息存储多长时间(表,易失性表)?
  • 任何其他评论collect statistics将不胜感激.

use*_*394 13

1>使用收集统计数据有什么缺点吗?

是的,收集统计信息本身很耗时,它实际上是从AMPS定位数据并将统计信息插入字典表中.

假设您有一个表定义,如:

ct t1(x1 int,y1 int,z1 int);

该表包含数百万行,并且从未在ST/Join条件中使用z1,因此不值得在z1上收集统计数据.

2>何时在SQL脚本中使用收集统计信息是否合适/不合适?

已在上面回答.如果某列将用作ST/Join条件.ie在where或on子句中,则必须收集统计信息,否则不需要.

3>收集已编入索引的字段的统计信息有什么性能优势?

ct t1(x1 int,y1 int)主索引(x1);

对于一个简单的查询,例如来自t1的sel*,其中x1 = 5;

将证明收集统计数据的有用性.

怎么样?

优化器可以正确估计此查询将选择多少行,如果t1将与t2连接,优化器将选择有效的连接.

4>统计信息存储多长时间(表,易失性表)?

表:永久.

易变量表:直到会话到期.

5>有关收集统计数据的任何其他意见将不胜感激.

关于多列统计数据没有讨论过.

说,查询如下:

sel*from t1 on t2 on y1 = y2 and x1 = 2;

然后在(x1,y1)上收集多列统计数据对于优化非常有帮助.

此外,如果表格人口统计学已更改(行数增加),您必须考虑重新收集统计数据