St. Louis closer Edward Mujica struck out J.D. Martinez with two on and two out to pick up his 24th save in 25 opportunities.
The Cardinals, who jumped out to a 7-0 lead, battered former nemesis Bud Norris (6-8) for seven runs and 11 hits in five innings. Norris entered the game with an 8-5 mark and a 2.74 ERA against St. Louis.
Norris won his first four starts against the Cardinals allowing just one run over 26 innings.
"I've been throwing the ball pretty well, but today wasn't my day," Norris said. "I made some good pitches, I made some bad pitches. That's a good ballclub over there. They know what they're doing."
Holliday slammed Norris' seventh pitch of the game over the left-field wall for a 2-0 lead. Carpenter highlighted a three-run rally in the fourth with a two-run double.
David Freese broke out of an 0-for-11 skid with three hits for St. Louis, which has won its last seven home games against Houston. Daniel Descalso chipped in with a pair of doubles.
Freese and Descalso started the fourth with hits. Carpenter pushed the lead to 5-0 with a double that just eluded a diving Carlos Pena at first. Carlos Beltran followed with an RBI single.
Allen Craig added run-scoring hits in the sixth and eighth. He is second in the NL with 71 RBIs.
"This was a full offensive game from top to bottom all the way through the lineup," Carpenter said. "It was impressive."
St. Louis reliever Kevin Siegrist pitched a scoreless eighth inning. He has not allowed a run over the first 12 appearances of his career, a franchise record.
The Astros scored four times in the ninth. Jake Elmore and Jose Altuve had RBI singles. Houston manager Bo Porter was pleased with the way his club fought until the end.