我正在为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万到5百万行。子查询与主表的ID返回1:1的关系,但需要WHERE子句来过滤日期。子查询SQL并不重要,我想这就是我想要传达的内容。
答案 0 :(得分:5)
当然,我们建议写联接,这就是为什么有一个选择器:-) 如果您创建临时表,则强制执行特定的处理顺序,而不是让优化程序决定哪个是最佳计划。
创建临时表可能在某些极少数情况下很有用,当您获得具有数十个连接的非常复杂的查询时,您需要将其分解为更易于维护的部分,或者您希望获得特定的PI以进行进一步处理。 / p>
关于测试不同的方法: 永远不应该使用运行时,它可能会根据服务器上的负载而有很大差异。您需要访问Teradata的查询日志(DBQL:dbc.QryLogV等)以获取有关实际CPU / IO /假脱机使用情况的详细信息。如果您无权访问它,您可能会要求您的DBA将其授予您。
顺便说一句,你应该创建VOLATILE TABLES而不是真正的表格,这些表格会在您注销时自动删除。