Share via

update query performance

Sam 1,476 Reputation points
2024-03-20T06:05:04.18+00:00

Hi All,

Need help in optimizing below UPDATE statements.

Have this long running 3 UPDATE statements doing lot of reads.

we r trying to refresh prod to one of sub-prod env. Will share the plans in some time.

Is there a good way to optimize below queries?

Few i can think of is, please provide your inputs.

-an index on md.TABLE_NAME

-an index on mq.ROWID_MQ_DATA_CHANGE

-an index on md.ROWID_MQ_DATA_CHANGE

-an index on p.ROWID_OBJECT

-an index on md.ROWID_OBJECT

-remove (nolock) as RCSI is turned on this Database

How can I make sure that i reduce the rows as early as possible in below 3 updates?

How to do the same in small batches to avoid blocking and lock escalations?

-- First Individual Update Statement
UPDATE mq
SET mq.sent_state_id = 6,
    UPDATED_BY = 'CONSOLIDATOR',
    STATUS_MESSAGE = 'ROWID_OBJECT NOT FOUND'
FROM C_REPOS_MQ_DATA_CHANGE mq
INNER JOIN #CPQ_Company md ON mq.ROWID_MQ_DATA_CHANGE = md.ROWID_MQ_DATA_CHANGE
    AND md.TABLE_NAME = 'C_B_PARTY'
    AND NOT EXISTS (SELECT 1 FROM C_B_PARTY p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT);

-- Second Individual Update Statement
UPDATE mq
SET mq.sent_state_id = 6,
    UPDATED_BY = 'CONSOLIDATOR',
    STATUS_MESSAGE = 'ROWID_OBJECT NOT FOUND'
FROM C_REPOS_MQ_DATA_CHANGE mq
INNER JOIN #CPQ_Company md ON mq.ROWID_MQ_DATA_CHANGE = md.ROWID_MQ_DATA_CHANGE
    AND md.TABLE_NAME = 'C_B_PARTY_COMM'
    AND NOT EXISTS (SELECT 1 FROM C_B_PARTY_COMM p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT);

-- Third Individual Update Statement
UPDATE mq
SET mq.sent_state_id = 6,
    UPDATED_BY = 'CONSOLIDATOR',
    STATUS_MESSAGE = 'ROWID_OBJECT NOT FOUND'
FROM C_REPOS_MQ_DATA_CHANGE mq
INNER JOIN #CPQ_Company md ON mq.ROWID_MQ_DATA_CHANGE = md.ROWID_MQ_DATA_CHANGE
    AND md.TABLE_NAME = 'C_B_ACCOUNT'
    AND NOT EXISTS (SELECT 1 FROM C_B_ACCOUNT p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT);

Next thing is, what is the advantage or performance gain we can take re-write above updates as single update?

how to prove/measure its performing well? like 2x or 5x times faster then original or less reads?

-- Single Combined Update Statement

UPDATE mq

SET mq.sent_state_id = 6,

    UPDATED_BY = 'CONSOLIDATOR',

    STATUS_MESSAGE = 'ROWID_OBJECT NOT FOUND'

FROM C_REPOS_MQ_DATA_CHANGE mq

INNER JOIN #CPQ_Company md ON mq.ROWID_MQ_DATA_CHANGE = md.ROWID_MQ_DATA_CHANGE

    AND (

        (md.TABLE_NAME = 'C_B_PARTY' AND NOT EXISTS (SELECT 1 FROM C_B_PARTY p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT))

        OR

        (md.TABLE_NAME = 'C_B_PARTY_COMM' AND NOT EXISTS (SELECT 1 FROM C_B_PARTY_COMM p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT))

        OR

        (md.TABLE_NAME = 'C_B_ACCOUNT' AND NOT EXISTS (SELECT 1 FROM C_B_ACCOUNT p (NOLOCK) WHERE p.ROWID_OBJECT = md.ROWID_OBJECT))

    );

Thanks,

Sam

SQL Server | Other
SQL Server | Other

Additional SQL Server features and topics not covered by specific categories

0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.