SQL server join与子查询性能问题

Dav*_*sey 6 sql sql-server join subquery

我发现在某些情况下查询类似

select 
   usertable.userid,
   (select top 1 name from nametable where userid = usertable.userid) as name 
from usertable 
where active = 1
Run Code Online (Sandbox Code Playgroud)

在SS2008R2中完成的时间比等效的连接查询要长一个数量级

select 
   usertable.userid,
   nametable.name 
from usertable 
left join nametable on nametable.userid = usertable.userid 
where usertable.active = 1
Run Code Online (Sandbox Code Playgroud)

其中两个表都已编入索引并且行数超过100k.有趣的是,在原始查询中插入一个top子句使其与连接查询相同:

select 
    top (select count(*) from usertable where active = 1) usertable.userid,
    (select top 1 name from nametable where userid = usertable.userid) as name 
from usertable 
where active = 1
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么原始查询表现如此糟糕?

Jus*_*tin 3

好吧,查询是不同的 - 除非userid列是主键或具有唯一性约束,否则第二个查询可能返回比第一个查询更多的行。

也就是说,假设 userid 是主键/唯一,请尝试删除TOP 1第一个子查询的部分:

select 
   usertable.userid,
   (select name from nametable where userid = usertable.userid) as name 
from usertable 
where active = 1
Run Code Online (Sandbox Code Playgroud)