【问题标题】:Forcing a PI scan for teradata table强制对 teradata 表进行 PI 扫描
【发布时间】:2015-02-12 23:16:32
【问题描述】:

我有一个表(比如 T1),它在 c1、c2 和 c3 列上定义了一个 PI。

在一个查询中,只需要在 c1 上进行过滤,并且由于给定的未知原因,我无法在 c1 列上创建二级索引。

我尝试编写这样的查询 -

select *
from T1
where C1 = <some Value>
and c2 = c2
and c3 = c3

鉴于 c2 和 c3 的条件是重言式,结果集不会受到影响。但是,我“期望”欺骗 Teradata 为该查询调用 PI,但这种情况不会发生。

有什么解释吗?

【问题讨论】:

  • 您的桌面上的统计数据是最新的吗?此外,当您说您试图“欺骗” Teradata 时,Teradata 中的主索引与 SQL Server 或 Oracle 中的索引不同。你能帮我澄清一下吗?
  • 好吧,当我使用“傻瓜”这个词时,我的意思不是不尊重。唯一的一点是,索引是一个包含 3 列的复合索引,而我的过滤器只需要一个。我还尝试使用 c2 'junk value' 并且 c2 不是空类型的条件,它们都不会调用 PI,只有当我提供具有相等条件的文字时才会调用 PI(c2 = ),这就是促使我使用 c2 = c2 类比的原因。想知道在这种情况下是否有办法调用 PI?
  • 你能发布解释计划吗?

标签: teradata


【解决方案1】:

Teradata 的 PI 是基于哈希的,因此必须使用基于相等性的 AND 条件引用所有三列。

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

【讨论】:

  • 好吧,二级索引并没有真正失败,鉴于我们是这个数据库的消费者,所有者不允许我们干预数据结构,让我们先不管它。感谢您对二级/连接索引/连接表等的建议。我提出的想法实际上是在 AND 条件下引用所有 PI 列。它真的不应该调用 PI 吗?
  • 所有三列都具有 AND 条件加上相等性,但无法根据该信息计算散列:hash(, , )?如果您无法更改表的 DDL,则必须使用全表扫描。这张桌子有多大?
【解决方案2】:

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

我不知道有一种方法可以查询您定义的基表并访问主索引而不完全限定它。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2011-07-01
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多