Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接表与连接视图的Teradata性能_Sql_Join_Views_Teradata - Fatal编程技术网

Sql 连接表与连接视图的Teradata性能

Sql 连接表与连接视图的Teradata性能,sql,join,views,teradata,Sql,Join,Views,Teradata,我有各种各样的桌子,我正在连接在一起。每个表都有一个主索引,并且大部分(但不是全部)在日期字段上进行分区。每个表都有一个关联的视图 如果我在表单中写一个查询 select * from view1 join view2 on pi1 = pi2 join view3 on pi1 = pi3 join view4 on pi1 = pi4 我遇到了线轴空间不足的问题。直接查询表是否更好?是否最好创建一些中间表并一次执行几个连接,然后在中间表上创建新的索引和分区 您应该首先检查查询的“解释”输

我有各种各样的桌子,我正在连接在一起。每个表都有一个主索引,并且大部分(但不是全部)在日期字段上进行分区。每个表都有一个关联的视图

如果我在表单中写一个查询

select
*
from view1
join view2
on pi1 = pi2
join view3
on pi1 = pi3
join view4
on pi1 = pi4


我遇到了线轴空间不足的问题。直接查询表是否更好?是否最好创建一些中间表并一次执行几个连接,然后在中间表上创建新的索引和分区

您应该首先检查查询的“解释”输出。[如果您使用的是Teradata SQL Assistant,则只需选择查询并按F6键-这将输出解析引擎(PE)关于如何执行查询的计划]

我怀疑您会在解释输出中看到很多“重新分配”[我认为,Teradata是一个隐藏的社会主义者]——记住,要连接两行,它们必须位于同一个放大器上。如果不是,则由于通过视图连接的每个表上的PI不同,因此需要重新分配

您还需要检查是否需要收集某些列的统计信息。不正确的统计数据可能会导致PE提出错误的查询计划。例如:如果您要加入的表中有一个很大,但表是倾斜的,则PE可能会错误地检测到它实际上是一个小表,并尝试将其复制到所有放大器(而不是重新分配),这通常会导致空间不足

你为什么不把问题的“解释”贴出来呢? 首先设置此选项:为会话打开诊断帮助状态


如果不查看视图正在做什么,就很难判断。

您应该首先检查查询的“解释”输出。[如果您使用的是Teradata SQL Assistant,则只需选择查询并按F6键-这将输出解析引擎(PE)关于如何执行查询的计划]

我怀疑您会在解释输出中看到很多“重新分配”[我认为,Teradata是一个隐藏的社会主义者]——记住,要连接两行,它们必须位于同一个放大器上。如果不是,则由于通过视图连接的每个表上的PI不同,因此需要重新分配

您还需要检查是否需要收集某些列的统计信息。不正确的统计数据可能会导致PE提出错误的查询计划。例如:如果您要加入的表中有一个很大,但表是倾斜的,则PE可能会错误地检测到它实际上是一个小表,并尝试将其复制到所有放大器(而不是重新分配),这通常会导致空间不足

你为什么不把问题的“解释”贴出来呢? 首先设置此选项:为会话打开诊断帮助状态


如果不查看视图正在做什么,就很难判断。

不需要创建中间表

在不了解更多细节的情况下,可能有一个简单的原因:

  • 有两个表,如发票发票\u行,逻辑 PK是(发票号)和(发票号、行号)

  • 这两个表的主索引都是(invoice_number)以获取所有行 用于单放大器上的发票,以加快处理速度

  • 这两个表都是按发票日期划分的(实际上保留 不需要发票行中的发票日期,因为它是相同的 每一行的日期。在这两行上都可以得到匹配的分区 (表格)

  • 加入不包括发票日期,它只是基于 发票号码。根据PK-FK,这是正确的,但会导致 非常慢的连接,因为优化器不知道是哪一个 发票号存储在哪个分区->所有分区需要 可以访问

在这种情况下,您必须使用发票日期作为附加的加入条件

否则,您必须提供更多信息:

如前所述:你应该发布解释

此外,它可能有助于获取PI定义(加上分区)和一些统计信息。
获取所有对象的DDL的最简单方法是在select(除非DBA限制)前面显示一个SHOW,统计数据由HELP stats tablename返回

不需要创建中间表

在不了解更多细节的情况下,可能有一个简单的原因:

  • 有两个表,如发票发票\u行,逻辑 PK是(发票号)和(发票号、行号)

  • 这两个表的主索引都是(invoice_number)以获取所有行 用于单放大器上的发票,以加快处理速度

  • 这两个表都是按发票日期划分的(实际上保留 不需要发票行中的发票日期,因为它是相同的 每一行的日期。在这两行上都可以得到匹配的分区 (表格)

  • 加入不包括发票日期,它只是基于 发票号码。根据PK-FK,这是正确的,但会导致 非常慢的连接,因为优化器不知道是哪一个 发票号存储在哪个分区->所有分区需要 可以访问

在这种情况下,您必须使用发票日期作为附加的加入条件

否则,您必须提供更多信息:

如前所述:你应该发布解释

此外,它可能有助于获取PI定义(加上分区)和一些统计信息。
获取所有对象的DDL的最简单方法是在select(除非DBA限制)前面显示一个SHOW,统计数据由HELP stats tablename返回

您的代码示例建议使用笛卡尔积,因为您没有加入任何字段。这代表什么