• Thank you for your inputs. Would need one more direction here on tuning. All indexes are in place.

    This is the only piece of code -

    WHILE @VersionID <> 0

    BEGIN

    UPDATE dbo.[VersionTable]

    SET [StatusCd] = 'Success' ,UpdateDttm = GETUTCDATE()

    WHERE VersionId = @VersionId

    EXECUTE @rc = [dbo].[GetVersionID] @Threadid,@VersionID OUTPUT

    END

    ------------------------------------------

    Procedure: dbo.GetVersionID

    ------------------------------------------

    CREATE PROC dbo.GetVersionID

    @Threadid int,

    @VersionId int OUTPUT

    AS

    BEGIN

    IF

    (SELECT TOP 1 1

    FROM dbo.VersionTable WHERE StatusCd = 'New')

    UPDATE TOP (1) dbo.VersionTable

    SET StatusCd = 'In Progress' ,ThreadId = @ThreadId,UpdateDttm = GETUTCDATE()

    WHERE StatusCd = 'New'

    IF (SELECT COUNT(1) FROM dbo.VersionTable

    WHERE ThreadId = @ThreadId AND StatusCd = 'In Progress') = 1

    SELECT @Versionid = VersionId

    FROM dbo.VersionTable

    WHERE ThreadId = @ThreadId

    AND StatusCd = 'In Progress'

    ELSE

    SET @VersionId = 0

    SELECT @VersionID

    Note - GetVersionID proc does two tasks-

    1. Picks the top 1 record that has StatusCd='New' for that passed ThreadId.

    2. Changes the status of that to StatusCd = 'In Progress' and returns the VersionID.

    ===============

    Table script

    =================

    CREATE TABLE [dbo].[VersionTable](

    [VersionID] [int] NOT NULL,

    [ThreadID] [int] NOT NULL,

    [UpdateDttm] [datetime] NOT NULL,

    [StatusCd] [varchar](10) NOT NULL,

    CONSTRAINT [PK_VersionTable] PRIMARY KEY CLUSTERED

    (

    [VersionID] ASC

    )

    ) ON [PRIMARY]

    ==========

    Data

    ===========

    INSERT INTO [dbo].[VersionTable]

    ([VersionID]

    ,[ThreadID]

    ,[UpdateDttm]

    ,[StatusCd])

    SELECT 1,1,GETUTCDATE(),'New'

    UNION ALL

    SELECT 2,1,GETUTCDATE(),'New'

    UNION ALL

    SELECT 3,1,GETUTCDATE(),'Success'