1. If you use "Assume Referential Integrity", you don't need to define keys in your database.
2. If you use "Assume Referential Integrity", it will only cull inner joins (so far).
3. If you have a mix of inner and outer joins, it will cull just the inner joins and leave the outer joins (so far).
In general, though, you should set up referential integrity in your database since it might find culling opportunities that Tableau doesn't see.
I also posted a blog that provides some insight into how join culling works on data-sets