To keep things simple, you can make a sub-selection. In my testing, this has the same performance as the cross-apply approach:
select firstname, lastname, (Select top 1 Display from _notes where _notes.ParentId = c.Id order by createdon desc) as MostRecentNote from _contacts c
For 47,000 records, this subsampling approach takes about 4 seconds. To do this quickly, I added a sorted index on _Notes, which included ParentId, CreatedOn (Sorted descending), and the Display column was turned on). This reduces the query to less than 1 second by 47 thousand records.
source share