Your contacts table may be pretty big, and the DISTINCT parameter will only remove duplicates if all columns contain the exact data, since you're retrieving all columns using SELECT *.
This presents other problems that you can either solve within your query or in your AMPSCRIPT in the message itself, namely: what if the contact record has been updated and you take the first but not most recent record?
If you aren't using the data in the contacts table in your message then there's no reason to build a data extension with it. This will make your data extension simpler and will allow you to make your query more specific to eliminate duplicates.
Another way to eliminate duplicates of course it so specify the removal of duplicates in your user-initiated send profile.
Let me know if that helps or if you have any other questions.