在Teradata我可以使用像…这样的声明
collect statistics on my_table column(col1)
这将收集表上的统计信息并将它们存储在DBC视图中,如ColumnStats,IndexStats和MultiColumnStats.我还认为优化器(解析引擎)会在可用时找到统计信息并使用它们而不是估计的基数/索引值计数来更好地决定如何执行查询.
这听起来很棒,但我有一些问题.
>使用收集统计数据有什么缺点吗?
>何时在sql脚本中使用收集统计信息是否合适/不合适?
>收集已编入索引的字段的统计信息的性能优势是什么?
>为(表,易失性表)存储统计信息多长时间?
>有关收集统计数据的任何其他意见将不胜感激.
解决方法
1>使用收集统计数据有什么缺点吗?
是的,收集统计信息本身很耗时,它实际上是从AMPS定位数据并将统计信息插入字典表中.
假设您有一个表定义,如:
ct t1(x1 int,y1 int,z1 int);
该表包含数百万行,并且从未在ST / Join条件中使用z1,因此不值得在z1上收集统计数据.
已在上面回答.如果要将列用作ST / Join条件.i.e在where或on子句中,则必须收集统计信息,否则不需要.
ct t1(x1 int,y1 int)主索引(x1);
对于一个简单的查询,例如来自t1的sel *,其中x1 = 5;
将证明收集统计数据的有用性.
怎么样?
优化器可以正确估计此查询将选择多少行,如果t1将与t2连接,优化器将选择有效的连接.
4>统计数据存储多长时间(表,易失性表)?
表:永久.
易变量表:直到会话到期.
没有讨论过多列统计数据.
说,查询如下:
sel * from t1在y1 = y2和x1 = 2时加入t2;
然后在(x1,y1)上收集多列统计数据对于优化非常有帮助.