3

我正在为 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
)

假设我之后清理了所有东西,一种方法比另一种方法更可取吗?再说一次,我想自己测试一下,但网络流量有点搞砸了。

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

4

1 回答 1

5

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

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

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

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

于 2013-08-14T18:33:26.200 回答