跨表联接时(如下例所示),联接表或联接仅包含所需列的子查询之间是否存在效率差异?
换句话说,这两个表在效率上有区别吗?
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/