【问题标题】:Does SQL execute subqueries fully?SQL 是否完全执行子查询?
【发布时间】:2018-09-05 16:59:14
【问题描述】:

想象一下,我有这个 SQL 查询,而 table2 是巨大的。

select product_id, count(product_id) 
from table1 
where table2_ptr_id in (select id 
                        from table2 
                        where author is not null)

SQL 会先执行子查询,然后将 table2 全部加载到内存中吗?就像如果 table1 有 10 行,而 table2 有 1000 万行,那么先加入然后过滤会更好吗?或者 DB 足够聪明,可以在编写此查询时对其进行优化。

【问题讨论】:

  • 数据库实际上更智能。他们接受查询,检查索引和统计信息,并将查询转换为利用任何现有索引的实际执行计划,使用基于数据统计的不同匹配算法等。如果 authorid 仅出现在索引中将使用索引数据页。
  • 我建议您开始使用EXPLAINEXPLAIN ANALYZE 来了解有关PostgreSQL 中查询计划和执行的更多信息。 PostgreSQL's documentation 中提供了这些语句及其输出的详细信息。

标签: postgresql


【解决方案1】:

您必须EXPLAIN 查询才能知道它在做什么。

但是,如果您将查询重写为 PostgreSQL,它可能会在 PostgreSQL 中执行得更好

SELECT product_id
FROM table1 
WHERE EXISTS (SELECT 1
              FROM table2
              WHERE table2.id = table1.table2_ptr_id
              AND table2.author IS NOT NULL);

然后 PostgreSQL 可以使用反连接,如果使用巨大的table2,它的性能可能会更好。

备注:您查询中的count 对我来说没有任何意义。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2019-04-23
    • 2013-09-18
    • 2012-02-29
    • 2011-01-13
    相关资源
    最近更新 更多