0

我有一個表Order,我想通過clientId刪除數據。該表格每個客戶端有超過2071458條記錄。而這個表有16個表的外鍵引用。當我嘗試刪除記錄時,需要2-4小時才能刪除記錄。那麼,如何提高性能來加快速度呢?如果是的話,我可以使用子查詢嗎?我可以在這個查詢中使用。以下是我正在使用的查詢。如何提高查詢性能,以更快速地刪除子表記錄

DECLARE @ORDERID int 
DECLARE DEL_RelDataOFOrdeTab CURSOR FOR 
SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID 
OPEN DEL_RelDataOFOrdeTab 

    FETCH NEXT FROM DEL_RelDataOFOrdeTab INTO @ORDERID 
    WHILE @@FETCH_STATUS = 0 

    BEGIN 
     DELETE FROM AUTHORIZED WHERE ORDERID = @ORDERID 
     DELETE FROM AUTODISPALERTS WHERE ORDERID = @ORDERID 
     DELETE FROM DRIVER_REIMBURSEMENT WHERE ORDERID = @ORDERID 
     DELETE FROM FAXPOD WHERE ORDERID = @ORDERID 
     DELETE FROM GENERICFIELDS WHERE ORDERID = @ORDERID 
     DELETE FROM [Messages] WHERE ORDERID = @ORDERID 
     DELETE FROM ORDAUDIT WHERE ORDERID = @ORDERID 
     DELETE FROM OrderNotification WHERE ORDERID = @ORDERID 
     DELETE FROM OrderNotificationActions WHERE ORDERID = @ORDERID 
     DELETE FROM ORDERSPAID WHERE ORDERID = @ORDERID 
     DELETE FROM ROUTESERVERORDERS WHERE ORDERID = @ORDERID 
     DELETE FROM UnfinalizedOrders WHERE ORDERID = @ORDERID 
     print 'DELETING FROM ORDE_' 
     DELETE FROM orde_ where ORDERID = @ORDERID 
     PRINT @ORDERID 
    FETCH NEXT FROM DEL_RelDataOFOrdeTab INTO @ORDERID 
    END 

CLOSE DEL_RelDataOFOrdeTab 
DEALLOCATE DEL_RelDataOFOrdeTab 

DELETE FROM orde_ WHERE CLIENTID = @ClientID 
+2

永不使用光標WHERE條款。 –

+0

@PareshJ所以我需要在這 –

回答

4

您可以刪除CURSOR,只是使用SUBQUERY

DELETE FROM AUTHORIZED WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM AUTODISPALERTS WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM DRIVER_REIMBURSEMENT WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM FAXPOD WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM GENERICFIELDS WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM [Messages] WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM ORDAUDIT WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM OrderNotification WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM OrderNotificationActions WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM ORDERSPAID WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM ROUTESERVERORDERS WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM UnfinalizedOrders WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
DELETE FROM orde_ WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 

基本上,它取代了

WHERE ORDERID = @ORDERID 

WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID) 
+0

使用我怎樣才能改變第二部分我的storeprocedure –

+0

你可以應用相同的邏輯。 –

+0

我嘗試一下,但在第二部分中感到困惑 –