2013-08-27 210 views
0

當我嘗試從具有外鍵約束的表中刪除某個表時,需要很長時間。 3分鐘後才能完成。如果我不喜歡這樣需要很長的時間:SQL Server 2008 DELETE時間太長

BEGIN TRANSACTION 

    DELETE FROM [T1] 
     WHERE 
    ROLEID = (SELECT ROLEID FROM T2 
    WHERE 
    NAME = 'GM') 

    ROLLBACK 

但後立即執行:

BEGIN TRANSACTION 

    DELETE FROM [T1] 
     WHERE 
    ROLEID = (5) 
    ROLLBACK 

顯然,第二個查詢沒有一個子查詢,但是我知道,在子查詢我第一個查詢只返回2行。爲什麼第一個查詢需要這麼長時間?

+1

問自己,多少次的子查詢被執行?提示,這比你想象的要多。 –

+6

如果第一個版本中的子查詢返回兩行,則應該生成一個錯誤。你檢查過嗎?對於多行,你應該使用'in'而不是'='。 –

+0

執行計劃是什麼樣的?這將告訴你什麼是如此之久。如果你可以在這裏發佈它可能有幫助。 – steoleary

回答

1

這裏是我想出了:

SELECT ROLEID 
    INTO #RIDS 
FROM APPROLES 
    WHERE 
    NAME IN ('GM', 'MINOR', 'USER') 

DELETE T1 FROM [ROLEFUNCS] T1 
     INNER JOIN [#RIDS] T2 ON T2.ROLEID = T1.ROLEID 

DELETE T3 FROM [USERROLES] T3 
     INNER JOIN [#RIDS] T2 ON T2.ROLEID = T3.ROLEID 

DELETE T4 FROM [ROLES] T4 
     INNER JOIN [#RIDS] T2 ON T2.ROLEID = T4.ROLEID 

DROP TABLE #RIDS 
+1

您可以接受您的答案..... –

+0

感謝您的提醒 – Dylan