【问题标题】:How to force Teradata parser to understand the join如何强制 Teradata 解析器理解连接
【发布时间】:2013-06-15 06:45:10
【问题描述】:

我希望您在下一个问题上提供帮助。这是一个真正的问题,但我将向您展示一个示例。

我有一个如下组成的视图

viewa =
sel * from
(
calendar_dim
inner join
(
sel * from table_a
inner join table_b
union all
sel * from table_c
inner join table_D
)
on...
)

所有表,table_a table_b table_c table_d 具有相同的 pi 和分区列(第一个分区级别是日期),统计数据是最新的。

我的问题如下:

如果我会尝试做一个查询,例如

sel *
  from viewa
 where cal_Date = '2013-05-31'
-->> the explain plan works perfect. It takes only one partition from each table and produce the result.

同样的情况发生在多个日期,/......where cal_Date in ('2013-05-31','','',......) (它需要正确数量的分区)。

但是,如果我尝试将这个视图与包含 10 个不同日期的表进行内部连接,我正在等待视图的每个表的 10 个分区将这个假脱机与外部表进行内部连接。

sel a.*
from viewa a
  inner join table_e b
   on a.cal_Date = b.cal_Date

它从视图的每个表中检索所有放大器,然后复制外部表。问题是视图中的 4 个表非常大,大约有 10 亿行。

解决方案?

我尝试制作一个易失性表(其中一列 = 日期),其中仅包含我所期望的不同日期,但什么也没有。仍然是相同的行为。

【问题讨论】:

  • 在参与此查询的表上收集了哪些统计信息?连接在一起的表的主索引定义是什么?这些视图与基表是 1:1 还是它们也执行连接?如果带有10 distinct dates 的表未分区或主索引与分区表不匹配,则将假脱机文件连接在一起所需的重新分配以及消除分区的能力实际上可能会丢失。

标签: sql database view teradata


【解决方案1】:

实际上,当您将“单表”条件添加到视图时,解析器本身会根据提供的值决定分区消除。

sel * from viewa where cal_Date = '2013-05-31' 

当您有“加入条件”时,解析器无法找出另一个表中有哪些值,因此可以在运行时通过动态分区消除来增强它,但不能像上面的情况那样通过静态分区消除来增强它。

sel a.* from viewa a inner join table_e b on a.cal_Date = b.cal_Date 

查看您的解释中是否出现以下短语“...join增强了动态分区消除...”。如果不尝试使用与其他表相同的分区表达式对 cal_date 上的 table_e 进行分区。它应该会有所帮助。

【讨论】:

  • 谢谢您的回复。不幸的是,没有分区消除。所有涉及的表都在 cal_date 分区并且具有相同的 PI,除了一个。我什至尝试了 Soft RI,但没有。正如我在第一篇文章中所写的那样,我试图将所有需要的值放在一个 volatile 表上,但什么也没有。没有办法强制消除动态分区,比如 oracle 提示(我知道它们在 Teradata 中不存在),我将重写查询?
  • 我找到的唯一解决方案是再添加一个过滤器,我将在其中再次分配我想要的时间段,......其中 cal_date 在(teradata 的函数)和 current_date 之间...... ..还有其他想法吗???提前感谢。
猜你喜欢
  • 2015-04-12
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2018-10-21
  • 2011-03-20
相关资源
最近更新 更多