2017-03-22 35 views
0

我有三个大表(加1万行)提高对孤立记录搜索查询速度

  • BIG1拥有Bigger1ID
  • 老二有Bigger1ID
  • BIG3有Bigger1ID

那个持有一个ID到另一个表(加上1000万行)

  • Bigger1有Biggest1ID

持有的ID到最终非常大的表(50万行)

  • Biggest1

我们发现是我们正在进行的孤儿问题Biggest1表在Bigger1表中保存一条记录,但不在Big表中。 我创建了以下查询,但性能不是很好,这可能只是由于大小,但我想知道是否有更快的方法来做到这一点。 我认为使用左连接插入临时表,但我没有看到任何收益。

SELECT 
    Biggest.ID, 
    Bigger.ID 
FROM 
    Biggest JOIN Bigger ON Biggest.BiggerID = Bigger.ID 
WHERE 
    Biggest.MyType IN ('type1', ' type2', 'type3') 
    AND NOT EXISTS (SELECT * FROM Big1 WHERE Bigger1.BiggerID = Big1.Bigger1ID) 
    AND NOT EXISTS (SELECT * FROM Big2 WHERE Bigger1.BiggerID = Big2.Bigger1ID) 
    AND NOT EXISTS (SELECT * FROM Big3 WHERE Bigger1.BiggerID = Big3.Bigger1ID) 

有没有更快的方法来做到这一点?

+2

问题寻求帮助的表现,应该包括像执行计划,涉及表的架构细节和瑞普测试:HTTPS: //support.microsoft.com/en-us/help/914288/how-to-generate-a-script-of-the-necessary-database-metadata-to-create-a-statistics-only-database-in- sql-server – TheGameiswar

回答

1

如果记录在Bigger Table中(你正在做一个内部连接,所以你看起来确实如此),那么你根本不需要查询最大的表。 然后只是:

SELECT * from bigger b 
    Left Join Big1 b1 on b1. Bigger1ID = b. Bigger1ID 
Left Join Big2 b2 on b2. Bigger1ID = b. Bigger1ID 
Left Join Big3 b3 on b3. Bigger1ID = b. Bigger1ID 
Where b3. Bigger1ID is null and b3. Bigger1ID is null and b3.Bigger1ID is null 

应该足够快。 如果需要 - 收集所有Bigger1ID,然后加入Biggest表以过滤出Type。

EG: Biggest.MyType IN( 'TYPE1', 'TYPE2', '3型')

+0

我需要最大的,因为我的意图是要删除存在于更大和最大的孤儿,我需要两者都有的id。大桌子是父母,孩子们是最大也是最大的。通常1个记录中的最大和5个最大。好点我会试试这个。 – treeNinja

+0

你确定在where子句中需要'b3.Bigger1ID为null'三次吗?不是'b1','b2'和'b3'? – HABO

+0

完全正确。懒惰的复制n粘贴。 –