gpt4 book ai didi

sql - Teradata SQL 中的多个连接 - 更快地使用子查询或临时表?

转载 作者:行者123 更新时间:2023-12-04 13:46:00 26 4
gpt4 key购买 nike

我正在为 Teradata 编写 SQL。我需要使用连接来连接来自多个表的数据。使用子查询或创建临时表并一次添加一个列通常是否更快?我正在尝试自己测试它,但网络流量让我很难分辨哪个更快。

示例 A:

SELECT a.ID, a.Date, b.Gender, c.Age
FROM mainTable AS a
LEFT JOIN (subquery 1) AS b ON b.ID = a.ID
LEFT JOIN (subquery 2) AS c ON c.ID = a.ID

或者我可以...

示例 B:
CREATE TABLE a AS (
SELECT mainTable.ID, mainTable.Date, sq.Gender
FROM mainTable
LEFT JOIN (subquery 1) AS sq ON sq.id = mainTable.ID
)
CREATE TABLE b AS (
SELECT a.ID, a.Date, a.Gender, sq.Age
FROM a
LEFT JOIN (subquery 2) AS sq ON sq.id = a.ID
)

假设我事后清理了所有东西,一种方法比另一种方法更可取吗?同样,我想自己测试一下,但网络流量有点让我感到困惑。

编辑:主表有 10 万到 500 万行。子查询返回与主​​表 ID 的 1:1 关系,但需要 WHERE 子句来过滤日期。子查询 SQL 不是微不足道的,我想这就是我想要传达的。

最佳答案

当然建议写连接,这就是为什么有一个优化器:-)
如果您创建临时表,您会强制执行特定的处理顺序,而不是让优化器决定哪个是最佳计划。

在极少数情况下创建临时表可能很有用,当您得到一个包含数十个连接的非常复杂的查询,并且您需要将其分解为更易于维护的部分,或者您希望获得特定的 PI 以进行进一步处理时。

关于测试不同的方法:
永远不应该为此使用运行时,它可能会根据服务器上的负载而有很大差异。您需要访问 Teradata 的查询日志(DBQL:dbc.QryLogV 等)以获取有关实际 CPU/IO/spool 使用情况的详细信息。如果您无权访问它,您可能会要求您的 DBA 将其授予您。

顺便说一句,您应该创建 VOLATILE TABLES 而不是真正的表,这些表会在您注销时自动删除。

关于sql - Teradata SQL 中的多个连接 - 更快地使用子查询或临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com