Reputation: 3494
i have a table Order
where i want to delete the data by clientId
. This table have more than 2071458 records per client . And this table have foreign key reference with 16 table . Wo when i try to delete the record by clientid it takes 2-4 hours to delete the reocord . So how can i improve the performance to do it faster. May i use subquery if yes how can i use in this query . Below is the query that i am using .
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
Upvotes: 0
Views: 85
Reputation: 31879
You can remove the CURSOR
and just use a 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)
Basically, it replaces the WHERE
clause from
WHERE ORDERID = @ORDERID
to
WHERE ORDERID IN (SELECT ORDERID FROM orde_ WHERE CLIENTID = @ClientID)
Upvotes: 4