What about adding a new derived column and index to each table that creates a hash across the 30 fields. Then do a compare of the hashes.
ALTER TABLE <tablename>
ADD HashVal AS HASHBYTES('MD5'
, ISNULL(Field1, '')
+ ',' + ISNULL(Field2, '')
+ ',' + ...
+ ',' + ISNULL(Field30, '')
) PERSISTED NOT NULL;
create nonclustered index ix_tablename_DeleteHash on <tablename> (HashVal[, PK]);
ALTER TABLE <secondtablename>
ADD HashVal AS HASHBYTES('MD5'
, ISNULL(Field1, '')
+ ',' + ISNULL(Field2, '')
+ ',' + ...
+ ',' + ISNULL(Field30, '')
) PERSISTED NOT NULL
create nonclustered index ix_secondtablename_DeleteHash on <secondtablename> (HashVal[, PK]);
Then do a delete based on the hash.
delete a
from <tablename> a
join <secondtablename> b
on a.HashVal = b.HashVal [and a.PK = b.PK]