我有2个表Person_Organization
和Person_Organization_other
,嵌套查询是:
SELECT
Person_Organization_id
FROM
Person_Organization_other
WHERE
company_name IN (SELECT company_name
FROM Person_Organization_other
WHERE Person_Organization_id IN (SELECT Person_Organization_Id
FROM Person_Organization
WHERE person_id = 117
AND delete_flag = 0)
)
以上查询的相应查询与我尝试的连接是: -
SELECT
poo.Person_Organization_id
FROM
Person_Organization_other poo, Person_Organization_other poo1, Person_Organization po
WHERE
poo1.Person_Organization_id = po.Person_Organization_Id
AND po.person_id = 117
AND po.delete_flag = 0
AND poo.company_name = poo1.company_name
GROUP BY
poo.Person_Organization_id
然而,与具有连接的相应查询相比,发现嵌套查询花费的时间更少。我使用SQL profiler跟踪来比较执行查询的时间。对于嵌套查询,它需要30多ms。对于连接查询,它需要41个奇数ms
我的印象是,通常嵌套查询的性能较差,应该使用连接“展平”。
有人可以解释我做错了吗?
问候 尼丁
答案 0 :(得分:1)
您正在使用交叉联接。尝试内连接。
select poo.Person_Organization_id
from Person_Organization po
INNER JOIN Person_Organization_other poo ON
poo.Person_Organization_id=po.Person_Organization_Id
INNER JOIN Person_Organization_other poo1 ON
poo1.Person_Organization_id=po.Person_Organization_Id AND
poo.company_name=poo1.company_name
where po.person_id=117 AND po.delete_flag=0
group by poo.Person_Organization_id
答案 1 :(得分:0)
通过用逗号分隔你的表,你实际上是十字架将它们连接在一起。我会尝试在表之间进行显式的INNER JOIN,看看是否有助于提高性能。
答案 2 :(得分:0)
嵌套查询性能较差且应该使用连接展平的观点是一个神话 - 不合适的嵌套子查询确实会导致性能问题,但在许多情况下使用子查询与使用连接一样好。
实际上,SQL服务器通过将它们减少到执行树来优化它执行的所有查询 - 通常使用JOIN的查询最终使用相同的执行树来代替使用嵌套查询的等效sql语句。
在这种情况下,这些的执行时间实际上是非常低的 - 差异可以很容易地解释为由于缓存等...没有被填充。
我的建议是使用任何对你更有意义的语法 - 如果你遇到性能问题,那么请回过头来检查嵌套子查询是否是导致问题的原因,但我绝对不会花时间担心“扁平化”不会导致问题的查询。
答案 3 :(得分:0)
您的表顺序可能会降低from table子句中的表顺序应该按行数递增的顺序