这是一个缓慢的查询?可以改进吗?

PM *_*7-1 5 sql oracle subquery query-optimization correlated-subquery

我正在通过SQLZOO" SELECT教程中的SELECT ",这是完成工作的一个查询(任务7)

世界(名称,大陆,地区,人口,gdp)

SELECT w1.name, w1.continent, w1.population 
FROM world w1
WHERE 25000000 >= ALL(SELECT w2.population FROM world w2 WHERE w2.continent=w1.continent)
Run Code Online (Sandbox Code Playgroud)

我的问题是关于此类查询的有效性.子查询将针对主查询的每一行(国家)运行,从而重复地重新填充给定大陆的ALL列表.

  1. 我应该关注还是Oracle优化会以某种方式处理它?
  2. 没有相关的子查询可以重新编程吗?

ype*_*eᵀᴹ 1

如果您想在没有关联子查询的情况下重写查询,这是一种方法:

SELECT w1.name, w1.continent, w1.population 
FROM world w1
  JOIN
    ( SELECT continent, MAX(population) AS max_population
      FROM world
      GROUP BY continent
    ) c
    ON c.continent = w1.continent
WHERE 25000000 >= c.max_population ;
Run Code Online (Sandbox Code Playgroud)

我并不是说这会更快。Oracle 的优化器非常好,无论您如何编写,这都是一个简单的整体查询。这是另一个简化:

SELECT w1.name, w1.continent, w1.population 
FROM world w1
  JOIN
    ( SELECT continent
      FROM world
      GROUP BY continent
      HAVING MAX(population) <= 25000000 
    ) c
    ON c.continent = w1.continent ;
Run Code Online (Sandbox Code Playgroud)