跨表联接时(如下例所示),联接表或联接仅包含所需列的子查询之间是否存在效率差异?

换句话说,这两个表在效率上有区别吗?

SELECT result
  FROM result_tbl
  JOIN test_tbl                    USING (test_id)
  JOIN sample_tbl                  USING (sample_id)
  JOIN (SELECT request_id
          FROM request_tbl
         WHERE request_status='A') USING(request_id)

对比
SELECT result
  FROM (SELECT result,  test_id   FROM result_tbl)
  JOIN (SELECT test_id, sample_id FROM test_tbl)   USING(test_id)
  JOIN (SELECT sample_id          FROM sample_tbl) USING(sample_id)
  JOIN (SELECT request_id
          FROM request_tbl
         WHERE request_status='A')                 USING(request_id)

最佳答案

没关系。它实际上可能更糟,因为您正在从通常最了解的优化器手中夺走控制权。

但是,请记住,如果您正在执行 JOIN 并且只包含其中一个表中的一列,那么将其重新编写为一系列 EXISTS 语句通常会更好——因为这就是您真正的意思。 JOIN(有一些异常(exception))将连接匹配的行,这是优化器要做的更多工作。

例如

SELECT t1.id1
  FROM table1 t1
 INNER JOIN table2 ON something = something

应该几乎总是
SELECT id1
  FROM table1 t1
 WHERE EXISTS( SELECT *
                 FROM table2
                WHERE something = something )

对于简单查询,优化器可能会将查询计划缩减为相同的查询计划。在您的 DBMS 上查看。

这也是一种代码异味,可能应该更改:

加入(选择 request_id
FROM request_tbl
WHERE request_status='A')


SELECT result
  FROM request
 WHERE EXISTS(...)
   AND request_status = 'A'

关于oracle - 表连接效率问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/853495/

10-13 05:14