Running a UPDATE on 3 million records
First, 4 hours seems like a long time for this.  I have done big updates and would not expect it to take this long were an inner join is involved (antijoins are more troublesome).

First to your questions:


If I removed all of the columns on the update_assets table, except for the pertinent columns for this transaction, will that speed up the transaction?   Maybe, if you rewrote the table after (using cluster, or select into).
Does postgresql always change data to text data for these types of joins?  Nope.  So turning everything to text will not help.


So what you can do is to look and see what is happening.  Initial troubleshooting steps need to be:


Run top and watch the query.  Is it I/O bound or CPU bound?   What is going on memory-usage-wise?
Does your db fit comfortably in RAM?  If not consider allocating more RAM to this vm.
Check the data types for the join columns.  Make sure these are the same.  Bad things can happen when it is casting to text for a join like this.
Check for locks.  Maybe the process is continuing slowly during a transactional period and waiting for locks periodically?