我需要对一些相关数据进行两级过滤。第一个查询类似于:
SELECT t1.fk_id
FROM t1
LEFT JOIN t3 ON t3.fk_id = t1.fk_id
WHERE t1.field1 > 10 AND t3.field2 = Y
第二个查询针对具有相同 fk_id 字段的另一个表运行,看起来像
SELECT t2.fk_id, SUM(t2.field3) AS sum_3, SUM(t2.field_4) AS sum_4
FROM t2
WHERE fk_id IN (fk_values_from_query_1)
GROUP BY t2.fk_id
HAVING sum_3 > 1000
现在,据我所知,我可以运行这两种不同的方式——尽管我不依赖于任何一种方法,也可以使用其他方法。我可以将第一个查询作为 SUB-SELECT 嵌入到第二个查询中,从性能的角度来看,我认为这非常糟糕。或者,我可以从查询 1 的结果中提取值,并将它们作为列表嵌入到查询 2 中(在我的应用程序代码中)。
这个问题的两个部分是:
- 上述两种查询结构之间在性能方面有什么区别吗?
- 有没有更好的方法来构建这两个查询?
基准
我没有对此进行全面测试,而是针对我的数据运行了我的版本以及 Barmar 发布的版本。我的查询运行了大约 4.23 秒,而 Barmar 的版本只用了 0.60 秒。这是一个 85% 的改进!