强制对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,但这并未发生。

有什么解释?

+0

您的统计数据是否最新?另外,当你说你试图“欺骗”Teradata时,Teradata中的主索引不像SQL Server或Oracle中的索引。你能为我澄清这一点吗? – Nick 2015-02-11 17:42:12

+0

嗯,我的意思是,当我使用“傻瓜”这个词时,并不尊重。唯一的一点是,该索引是一个包含3列的复合索引,我的过滤器只需要一个索引。我也尝试使用c2 'junk value',并且c2不是null类型的条件,它们都不会调用PI,只有当我在提供具有相等条件的文字时调用PI时(c2 = ) ,那是什么促使我使用c2 = c2 anology .. 想知道在这种情况下是否有办法调用PI? – Gyan 2015-02-11 18:01:26

+0

你可以发布解释计划吗? – Nick 2015-02-11 18:56:49

您可以使用列'C1'的主索引创建散列索引或单个表连接索引。这将允许您对索引进行单一或组AMP访问,然后对基表进行行ID访问。另一个选项,如果'C1'是唯一的,则在该列上创建一个USI。如果在符合条件时提供多个值,这将最多为您提供带有单个值或组AMP选项的双AMP操作。

我不知道一种方法来查询基本表,因为你有它的定义和访问主索引没有完全限定它。

Teradata的PI是基于散列的,因此所有三列必须基于相等性与ANDed条件进行引用。

当只有一列已知时,无法获得PI访问。 但是,当然你可以创建一个二级索引(为什么失败?)。如果这是反复出现的要求,您最好考虑更改PI和/或添加分区。

+0

那么,二级索引并没有真正失败,因为我们是这个数据库的消费者,所有者不允许我们干涉数据结构,让我们留下它。 我很欣赏你对辅助/连接索引/连接表等的建议。我把这个想法放在一起,实际上是在AND条件中引用所有的PI列。如果它真的不调用PI? – Gyan 2015-02-12 10:11:31

+0

这是所有三列与AND条件加上相等,但没有办法根据该信息计算散列:散列(,,)?如果您无法更改表格的DDL,则必须使用全表扫描。这张桌子有多大? – dnoeth 2015-02-12 15:19:52