我有各种各样的桌子要连接在一起。每个表都有一个主索引,并且大多数但不是全部都在日期字段上进行分区。每个表都有一个关联的视图。
如果我在表格中写一个查询
select
*
from view1
join view2
on pi1 = pi2
join view3
on pi1 = pi3
join view4
on pi1 = pi4
...
我遇到了线轴空间不足的问题。直接查询表会更好吗?一次创建一些中间表并进行一些连接,然后在中间表上创建新的索引和分区会更好吗?
不必创建中间表。
在不了解更多细节的情况下,可能有一个简单的原因:
有两个表,如invoice和invoice_line,逻辑 PK 是 (invoice_number) 和 (invoice_number, line_number)。
两个表的主索引都是 (invoice_number),用于获取单个 AMP 上发票的所有行,以加快处理速度。
两个表都按 invoice_date 分区(实际上不需要将 invoice_date 保留在 invoice_line 中,因为每一行的日期相同。这样做是为了在两个表上获得匹配的分区)
加入不包括 invoice_date,它只是基于 invoice_number。这基于 PK-FK 是正确的,但会导致连接非常缓慢,因为优化器不知道哪个 invoice_number 存储在哪个分区中 -> 需要访问所有分区。
在这种情况下,您必须使用 invoice_date 作为附加连接条件。
否则,您必须提供更多信息:
如前所述:您应该发布解释。
此外,它可能有助于获取 PI 定义(加上分区)和一些统计信息。获取所有对象的 DDL 的最简单方法是在 select 前面加上SHOW(除非您的 DBA 限制),统计信息由HELP STATS 表名返回;
您应该首先检查查询的“解释”输出。[如果您使用的是 Teradata SQL 助手,那么只需选择您的查询并按 F6 - 这将输出解析引擎 (PE) 关于如何执行您的查询的计划]。
我怀疑您会在解释输出中看到很多“重新分配”[我认为,Teradata 是一个壁橱社会主义者] - 请记住要连接的两行,它们必须位于同一个 AMP 上。如果它们不是,由于您通过视图连接的每个表上的不同 PI,重新分配将是必要的。
您还想检查是否需要收集某些列的任何统计信息。不正确的统计数据可能导致 PE 提出荒谬的查询计划。例如:如果您要加入的表中的一个很大但表偏斜 - PE 可能会错误地检测到它实际上是一个小表并尝试将其复制到所有 AMPS(而不是重新分配),这通常会导致在你空间不足的情况下。
您为什么不继续发布您的查询的“解释”?先设置这个选项:DIAGNOSTIC HELPSTATS ON FOR SESSION;
如果不查看视图在做什么,就很难判断。