强制对teradata表进行PI扫描
问题描述:
我有一个表(比如T1),它在列c1,c2和c3上定义了一个PI。强制对teradata表进行PI扫描
在一个查询中,需要对c1进行过滤,并且对于给定的未知原因,我不能在列c1上创建二级索引。
我试着写一个这样的查询 -
select *
from T1
where C1 = <some Value>
and c2 = c2
and c3 = c3
因为对于C2和C3条件是同义反复,结果集将不会受到影响。但是,我“期待”欺骗Teradata为此查询调用PI,但这并未发生。
有什么解释?
答
您可以使用列'C1'的主索引创建散列索引或单个表连接索引。这将允许您对索引进行单一或组AMP访问,然后对基表进行行ID访问。另一个选项,如果'C1'是唯一的,则在该列上创建一个USI。如果在符合条件时提供多个值,这将最多为您提供带有单个值或组AMP选项的双AMP操作。
我不知道一种方法来查询基本表,因为你有它的定义和访问主索引没有完全限定它。
答
Teradata的PI是基于散列的,因此所有三列必须基于相等性与ANDed条件进行引用。
当只有一列已知时,无法获得PI访问。 但是,当然你可以创建一个二级索引(为什么失败?)。如果这是反复出现的要求,您最好考虑更改PI和/或添加分区。
您的统计数据是否最新?另外,当你说你试图“欺骗”Teradata时,Teradata中的主索引不像SQL Server或Oracle中的索引。你能为我澄清这一点吗? – Nick 2015-02-11 17:42:12
嗯,我的意思是,当我使用“傻瓜”这个词时,并不尊重。唯一的一点是,该索引是一个包含3列的复合索引,我的过滤器只需要一个索引。我也尝试使用c2 'junk value',并且c2不是null类型的条件,它们都不会调用PI,只有当我在提供具有相等条件的文字时调用PI时(c2 =) ,那是什么促使我使用c2 = c2 anology .. 想知道在这种情况下是否有办法调用PI? –
Gyan
2015-02-11 18:01:26
你可以发布解释计划吗? – Nick 2015-02-11 18:56:49