我正在为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
Run Code Online (Sandbox Code Playgroud)
或者我可以......
例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
)
Run Code Online (Sandbox Code Playgroud)
假设我之后清理了所有东西,一种方法比另一种更好吗?再一次,我想自己测试一下,但网络流量有点让我感到困惑.
编辑: 主表有100k到500万行.子查询返回与主表的ID的1:1关系,但需要WHERE子句来过滤日期.子查询SQL并不简单,我想我正在努力传达.
当然,建议编写连接,这就是为什么有一个optmizer :-)如果你创建临时表,你强制执行特定的处理顺序,而不是让优化器决定哪个是最好的计划.
创建临时表可能在某些极少数情况下很有用,当您获得具有数十个连接的非常复杂的查询时,您需要将其分解为更易于维护的部分,或者您希望获得特定的PI以进行进一步处理.
关于测试不同的方法:永远不应该使用运行时,它可能会根据服务器上的负载而有很大差异.您需要访问Teradata的查询日志(DBQL:dbc.QryLogV等)以获取有关实际CPU/IO /假脱机使用情况的详细信息.如果您无法访问它,您可能会要求您的DBA将其授予您.
顺便说一句,你应该创建VOLATILE TABLES而不是真正的表格,这些表格会在您注销时自动删除.
| 归档时间: |
|
| 查看次数: |
15154 次 |
| 最近记录: |