• 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]