子查询性能中的 SELECT *

问题描述 投票:0回答:1

我想知道的是,在子查询中执行

SELECT *
是否会被数据库引擎优化掉?下面的两个代码片段的性能是否相同?

SELECT A, B, C FROM (SELECT * FROM table1)
SELECT A, B, C FROM (SELECT A, B, C FROM table1)

如果答案是取决于不同的引擎,那么对于postgresql来说,它的性能是否相同?

sql postgresql query-optimization
1个回答
-1
投票

大多数当代关系数据库管理系统 (RDBMS)(例如 PostgreSQL)中的查询优化器并不总是消除包含 SELECT * 的子查询。但在性能方面有一些事情需要考虑。

示例中的两个搜索在 PostgreSQL 中的执行情况可能类似。在大多数情况下,这是因为 PostgreSQL 的查询优化器足够智能,可以理解从子查询中选择所有列 (*) 与直接选择这些列相同。因此,PostgreSQL 会在这两种情况下对查询进行内部优化,以仅选择表 1 中的 A、B 和 C 列。

虽然此特定实例中的性能可能相当,但请务必记住,使用 SELECT * 偶尔会导致性能问题,特别是在数据库结构发生变化或将来添加更多列的情况下。除了使查询更加清晰和可维护之外,显式定义列(SELECT A、B 和 C)还可以保证查询不会受到此类修改的影响。

总之,即使内部 PostgreSQL 优化可能会导致两个查询的性能相当,但最佳实践始终是专门指定所需的列,而不是依赖于 SELECT *。

© www.soinside.com 2019 - 2024. All rights reserved.