Tommy Hanson (2-2) shut down the Astros after allowing two runs in the second. He limited Houston to four hits over eight innings and has given up no more than two earned runs in any of his five starts this season.
Hanson did not walk a batter and struck out seven.
With Brett Myers (1-2) on the mound in the third, Troy Glaus drew a one-out walk and scored when Heyward hit the first pitch he saw over the wall in center. It was Heyward's sixth homer of the season and he was robbed of another in the eighth when right fielder Hunter Pence made a catch at the wall.
Billy Wagner worked the ninth for his second save, finishing off a stretch in which 17 of the last 18 Houston batters were retired.
The Astros have lost four in a row.