ano*_*xen 16 sql sql-server oracle exists
两者中哪一个表现更好(我最近被指责不小心我的代码,因为我在Oracle中使用了后者):
Select *
from Tab1
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id)
Select *
from Tab1
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id)
Run Code Online (Sandbox Code Playgroud)
或者他们俩都一样?
请从SQL Server透视图和Oracle透视图中回答这两个问题.
我用google搜索(主要来自sql-server方面)并发现对此仍存在很多争论,尽管我现在的意见/假设是RDMBS中的优化者已经足够成熟,可以理解子查询所需要的只是布尔值.
Pat*_*man 16
是的,他们是一样的.exists
检查子查询中是否至少有一行.如果是,则评估为true
.子查询中的列无论如何都无关紧要.
根据MSDN,exists
:
指定要测试行是否存在的子查询.
而甲骨文:
EXISTS条件测试子查询中是否存在行.
也许MySQL文档更能解释:
传统上,EXISTS子查询以SELECT*开头,但它可以从SELECT 5或SELECT column1开始,或者任何东西.MySQL忽略了这样一个子查询中的SELECT列表,所以没有区别.
我知道这很旧,但是想补充一下我最近观察到的几点。
即使存在只检查是否存在,当我们全部编写“ select *”时,列也会被扩展,除了这微小的开销外,没有任何区别。
来源:http:
//www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/
更新:
我提到的文章似乎无效。即使在我们撰写本文时select 1
,SQLServer也会展开所有列..
使用各种方法时,请参考以下链接以进行深度分析和性能统计。