Why indexes are not speeding up multiple join query
@Jehad Keriaki provided the answer. The lastContacts table's primary key column, ContactID, was defined as a string while the same column in each of the other tables was an integer. Joining tables on that column caused implicit conversion and resulted in poor performance.