与列数少于原始表的临时表的联接是不是比与原始表的联接更快?

Posted

技术标签:

【中文标题】与列数少于原始表的临时表的联接是不是比与原始表的联接更快?【英文标题】:Is a join with a temporary table having fewer columns than original table faster than join with original table?与列数少于原始表的临时表的联接是否比与原始表的联接更快? 【发布时间】:2021-03-11 08:06:21 【问题描述】:

请记住,Redshift 是一个列式数据库服务器,假设我有一个包含 50 列的表 A,我需要将它与表 B 连接,但在最终连接结果中我只需要表 A 中的 10 列。 假设表 C 是从表 A 创建的临时表,其中包含我需要的 10 列。

    [表 C 加入表 B] 会比 [表 A 加入表 B] 快吗 假设表 A 本身是一个临时表(派生自其他表),您对 #1 的响应是否仍然成立?

【问题讨论】:

【参考方案1】:

除了单独存储列之外,Redshift 还有其他优化。

也就是说,我希望引用单个表中的所有 10 列与引用具有更多列的表中的 10 列之间的性能非常相似。很难想到会受到未引用列影响的优化。

我不明白问题的第二部分。表就是表,无论是否是临时的。如果您的意思是“临时表和运行子查询/CTE 之间是否存在性能差异?”。那么是的,肯定有区别。例如,在创建表、存储数据和重新读取数据方面存在开销。另一方面,优化器可能会为临时表选择更好的执行计划——这并不典型,但它确实发生了。

【讨论】:

非常感谢戈登,非常有帮助!顺便说一句,我的问题的第二部分只是意味着 - 如果表 A 是临时的而不是临时的,会有所不同,但你已经回答了。

以上是关于与列数少于原始表的临时表的联接是不是比与原始表的联接更快?的主要内容,如果未能解决你的问题,请参考以下文章

使用忽略连接表的原始表的计数函数

用另一个 MySQL 表的值更新一个 MySQL 表(原始表的数据类型是 JSOn)

如何在 Access 中使用来自另一个表的联接从一个表中删除项目?

从影子表到原始表的 SQLite Rtree 映射 id(s)

用连接到原始 SQL 表的表字符串事件填充的列

保存工作表的副本并撤销对原始文件的所有更改