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

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