gpt4 book ai didi

sql - SQL "EXISTS"使用变体的性能

转载 作者:行者123 更新时间:2023-12-02 07:47:06 25 4
gpt4 key购买 nike

以下三个SQL语句的性能有什么区别吗?

SELECT * FROM tableA WHERE EXISTS (SELECT * FROM tableB WHERE tableA.x = tableB.y)

SELECT * FROM tableA WHERE EXISTS (SELECT y FROM tableB WHERE tableA.x = tableB.y)

SELECT * FROM tableA WHERE EXISTS (SELECT 1 FROM tableB WHERE tableA.x = tableB.y)

它们都应该工作并返回相同的结果集。但是内部 SELECT 选择 tableB 的所有字段、一个字段还是仅选择一个常量有关系吗?

当所有语句表现相同时是否有最佳实践?

最佳答案

关于 EXISTS 子句的真相是 SELECT 子句不会在 EXISTS 子句中求值 - 您可以尝试:

SELECT * 
FROM tableA
WHERE EXISTS (SELECT 1/0
FROM tableB
WHERE tableA.x = tableB.y)

...并且应该预期会出现除以零的错误,但您不会,因为它没有被评估。这就是为什么我的习惯是在 EXISTS 中指定 NULL 来证明 SELECT 可以被忽略:

SELECT * 
FROM tableA
WHERE EXISTS (SELECT NULL
FROM tableB
WHERE tableA.x = tableB.y)

EXISTS 子句中最重要的是 FROM 及其他子句 - WHERE、GROUP BY、HAVING 等。

这个问题没有标记数据库,这应该是因为供应商处理事情的方式不同——所以测试,并检查解释/执行计划来确认。版本之间的行为可能会发生变化......

关于sql - SQL "EXISTS"使用变体的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/424212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com