2016-09-21 47 views
0

我需要找到一种更有效的方法来清楚地加入两个表中的两组数据。数据保存在两张经过碎片整理,压缩和索引的表中。其索引也进行了碎片整理和压缩。工会之前,结果集已经是有限的。有问题的代码的联盟声明的高效替代方案

实施例:

Select * From (
     Select A.entry_id, First_name, last_name, Mobile_Phone, Email_Address, '1' As 'ownership' 
      From userAddressBook As A Join collectionMapping As B On A.entry_id=B.entry_id 
      Where [email protected] And [email protected] 
     Union 
     Select A.entry_id, First_name, last_name, Mobile_Phone, Email_Address, '0' As 'ownership' 
      From userAddressBook As A Join collectionMapping As B On A.entry_id=B.entry_id 
      Where A.UserID<>@UserID And [email protected] 
    ) As UnionTable 
    Order By last_name Asc, First_name Asc, entry_id Asc 

我理想地寻找可以提供相同的结果的另一种方法。我已经试过如下:

  • 在选择自Union不同所有
  • 双重插入到表变量和选择不同
  • 双重插入到临时表,并选择不同的 (以及上述的变型具有索引这种方式只在底部修改索引)

我知道不平衡的联合会导致性能问题,但是在这种情况下,这个查询总是会被平衡打中。

对此事的任何帮助将不胜感激,谢谢。

回答

0
Select 
    A.entry_id 
    ,First_name 
    ,last_name 
    ,Mobile_Phone 
    ,Email_Address 

    ,CASE WHEN A.UserId = @UserId THEN '1' ELSE '0' END As 'ownership' 

From 
    userAddressBook As A 
    Join collectionMapping As B 
    On A.entry_id=B.entry_id 
Where 
    B.GroupNameID = @groupidentifier 
Order By 
    last_name Asc 
    ,First_name Asc 
    ,entry_id Asc 

您几乎完全相同的查询,使用CASE表达式,并在一个单一的查询做它会做得更多。