“where column in (select id from table)”和“where column = (select id from table)”在性能方面有什么区别?

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

假设我只想从表中获取最新的日期数据。 所以,我写了下面的查询。

查询1:

select *
from tbl1
where dw_date = (select max(dw_date) from tbl)

查询2:

select *
from tbl1
where dw_date in (select max(dw_date) from tbl)

两个查询都会做同样的事情。

但是,我想知道哪个查询在大表上性能更好。

问题:

  1. 每次外层查询的每条记录都会运行内层子查询吗?
  2. 无论使用
    max(dw_date)
    dw_date in ()
    ,每次都会计算
    dw_date = ()
    吗?

我尝试使用上述查询,并给出了正确的输出。 我想知道查询将如何执行,它在后端如何工作。

sql mysql sql-server postgresql oracle-sqldeveloper
1个回答
0
投票
  1. 内部子查询是否每次都会针对外部查询的每条记录运行? 在这两个查询中,子查询 SELECT MAX(dw_date) FROM tbl1 不会针对外部查询的每个记录运行。大多数现代 SQL 数据库(例如 MySQL、PostgreSQL、SQL Server 和 Oracle)都经过优化,可以在整个查询中仅计算一次。

后端执行: 子查询的单次执行:数据库计算一次 MAX(dw_date),检索结果,然后使用该值应用外部查询的过滤器。优化器确保不会为外表中的每一行重新计算子查询。

例如: 子查询 SELECT MAX(dw_date) FROM tbl1 将返回 2023-09-03。 然后外部查询将检查 tbl1 中每一行的 dw_date = '2023-09-03' 。

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