2013-04-21 32 views
2

我最近写它有这部分SQL查询效率 - UNION的影响的所有

select T.Id from Teams T 
inner join 
(
    select SG.Team1Id, SG.Team2Id from SG 
    union all 
    select SP.Team1Id, SP.Team2Id from SP 
) G 
on T.Id in (G.Team1Id, G.Team2Id) 

我怀疑这个查询效率

将这个查询从SG和获取所有记录的存储过程子查询中的SP然后会应用连接条件吗?如果是的话,那么我认为这是没有效率的

的SQL Server是足够聪明,只从两个匹配连接的标准表获取行?

+2

发布查询计划,以便我们可以了解引擎如何执行此查询。 (G.Team1Id,G.Team2Id)中的T.Id上的' – 2013-04-21 18:56:36

+1

''表示您将始终获得嵌套循环连接。它是'T.Id = G.Team1Id或T.Id = G.Team2Id'。参见[在INNER JOIN条件中有一个'OR'是一个坏主意?](http://stackoverflow.com/questions/5901791/is-having-an-or-in-an-inner-join-condition-a -bad-idea/5901901#5901901) – 2013-04-21 19:25:39

回答

2

派生表的UNION ALL很可能会比

SELECT T.Id 
FROM Teams T 
     INNER JOIN SG 
     ON T.Id IN (SG.Team1Id, SG.Team2Id) 
UNION ALL 
SELECT T.Id 
FROM Teams T 
     INNER JOIN SP 
     ON T.Id IN (SP.Team1Id, SP.Team2Id) 

替代配方有效的,因为在你的问题的版本将只需要一个穿过Teams。如果表SPSG有限制,使得Team1Id不能是相同的Team2Id和各个列被索引则以下可以执行更好(对于某些数据分布,特别是如果Teams相比所涉及的其它表是比较大的)

SELECT T.Id 
FROM Teams T 
     INNER JOIN (SELECT SG.Team1Id 
        FROM SG 
        UNION ALL 
        SELECT SG.Team2Id 
        FROM SG 
        UNION ALL 
        SELECT SP.Team1Id 
        FROM SP 
        UNION ALL 
        SELECT SP.Team2Id 
        FROM SP) G(TeamId) 
     ON T.Id = G.TeamId 
+0

另外,优化器可以从2到1,但不能从1到2。截至2012年,这是一个不幸的限制。 – usr 2013-04-21 21:23:10