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