I recommend a send log. Ask support to enable the functionality, then create a data extension "from template" / SendLog.
Every record that is actually sent from your BU is inserted into this data extension at send time. here is the documentation for this.
Since every one of your sent events needs an ID, either you have an external system set such an ID, or you create such a "Send event key" from the default parameters tracked in the send log:
jobID, BatchID,ListID, SubID.
The combination of these four constitutes a unique send event. BatchID and listId become relevant in journey builder. JB doesn't change the JobID even if you get the same message twice.
The _CustomObjectKey is great, but will not help you much, because it has no relationship to the system tracking in the data views.
For your usecase, you want: all unique send events which are in:
a) the system tracking table for sent (data view "_Sent")
b) the send log.
(theoretically the send log alone would be enough, but it doesnt have the subscriberKey, which we can find in "_sent")
c) your data extension.
You can use an SQL inner join to find these.
The SQL would look something like that (untested)
/*get every subscriber key in the _Sent data view, which holds the Subscriber Key ...*/
on sl.SubID = s.SubscriberID
AND sl.JobID = s.JobID
AND sl.BatchID = s.BatchID
AND sl.ListId = s.ListId
/*... that matches a send event in your send log data extension.
finding a send event must happen on the four unique parameters subscriberId, jobid, batchid and listid. */
on s.SubscriberKey = de.SubscriberKey
/*now just filter the above to retrieve only those subscriber keys who are also in your source DE, otherwise you have ALL sends from the BU, not just
your sendable DE in the result.*/
The resulting DE has only the entries from your DE which have been sent something. You could include a WHERE clause to limit the timeframe.
Hope this helps.