Daily SQL job to delete records older than 24 hours
From Comments

Have you tested performance of copying data of a single day to a temporary table, truncating the target table, and re-inserting the copied data back to the target table?


  Yes, it's not taking much time to copy or insert, it is taking time to delete and select. One of the column has huge XML string.


Proposed Solution

Since inserting and copying data does not seem to yield a performance penalty, I would suggest to:


copy to data of today to a staging table
truncate the existing table (much faster than delete, no transaction logs)
copy staged data back to existing table


Or alternatively, as Dannnno suggests:

Potentially faster than copying the data twice would be to copy data to a staging table, truncate the existing table, then rename them both to swap places. This minimizes latches required for DDL, and also only requires a single copy. Snapshot isolation would also help this be as non-invasive as possible for anyone hitting the database.

Links


Similar problem: non-clustered index bottleneck on delete
Enlists a couple of possible solutions