【问题标题】:SQL query efficiency - impact of UNION ALLSQL查询效率——UNION ALL的影响
【发布时间】:2013-04-14 15:13:03
【问题描述】:

我最近写了一个有这部分的存储过程

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)

我怀疑这个查询效率

此查询是否会从子查询中的SGSP 中获取所有记录,然后应用连接条件?如果是,那么我认为这不是有效的

Sql server 足够聪明,只能从两个表中获取符合连接条件的行?

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

派生表中的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 

【讨论】:

  • 此外,优化器可以从 2 变为 1,但不能从 1 变为 2。这是 2012 年的不幸限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多