HOUSTON -- St. Louis starter Adam Wainwright thought about the undefeated record Houston's Bud Norris had against his team and was determined to help end the streak.
"I told myself from the very beginning: 'If he's going to throw a shutout, then he's going to tie,"' Wainwright said. "He was not going to beat me today."
Albert Pujols drove in three runs and Kyle McClellan pitched a perfect ninth to complete the shutout for St. Louis and end a three-game skid.
Houston snapped a three-game winning streak and was shut out for the ninth time this season.
Wainwright (13-5) gave up six hits and struck out four to improve to 9-1 in his career against Houston.
"He was mixing pitches really well," Houston manager Brad Mills said. "It was tough to get a bead, and when we did, he took some off that curveball and added some to the slider and slotted his fastball. He was throwing the ball really well."
Norris (2-6) gave up seven hits and five runs in 7 2/3 innings for his first career loss to the Cardinals. He entered the game 4-0 with a 0.35 ERA in four starts against St. Louis.
"We scored a couple of runs early and he settled down," Pujols said of Norris. "He's pretty tough. We took a different game plan today and we executed that and obviously took advantage of the mistake he made."
The Astros couldn't string anything together against Wainwright, and the best they did was get two runners on base in both the fourth and eighth innings. But Houston came up empty both times after Wainwright struck out Chris Johnson to end the fourth and Carlos Lee flew out in the eighth.
Holliday's homer, which bounced high off the wall in left field and chased Norris, came after he allowed a double to Colby Rasmus and intentionally walked Pujols with two outs in the eighth inning.
"You pitch to Albert there's potential for damage and you put an extra base runner with what's Matt's capable of doing, you're talking about a lot of crooked numbers for our team," Cardinals manager Tony La Russa said. "If we get that going in the second half of the season, we're a different-looking team."
Pujols homered to left field with one on and two out in the ninth inning off Casey Daigle to stretch the lead to 8-0.
Rasmus also doubled in the first inning before scoring on a double by Pujols to make it 1-0. Tyler Greene added a double in the second inning and scored on a single by Skip Schumaker.
Norris got in a groove after the early runs, sailing through the next few innings, retiring 13 in a row after Schumaker's hit. He didn't allow another baserunner until a single by Jon Jay to start the seventh inning. Jay was left stranded when Norris retired the next three batters.
"I didn't look too far into being 4-0 against them," Norris said. "It's kind of nice to know you had a little success against them when you're going over video, but any night, anything can happen."
Felipe Lopez had a run-scoring double in the ninth inning off Gustavo Chacin that made it 6-0 before the home run by Pujols.
Rasmus left the game in the middle of the eighth inning with tightness in his right hamstring. La Russa said he wasn't sure if Rasmus would be available on Saturday. ... La Russa could have trouble setting his rotation after the All-Star break if RHP Chris Carpenter and Wainwright both pitch in the game. Still, he said that he wouldn't ask National League manager Charlie Manuel not to use either of his pitchers. He would, however, consider asking Manuel how he planned to use them so he could get an idea of how to set the rotation. ... Houston RHP Felipe Paulino, who is on the disabled list with right shoulder tendinitis, felt good on Friday, a day after throwing 30 pitches of live batting practice. He is scheduled to return to the rotation after the break.