2017-03-22 34 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粘貼。 –