SAN FRANCISCO -- Chris Volstad knew he had it from the first pitch that left his hand.
"It was one of those days everything just came together," he said.
It was, indeed.
Volstad (6-8) struck out six and didn't walk a batter to win for just the second time in eight starts, finishing the 2-hour, 22-minute game on an efficient 105 pitches. The Marlins ended a four-game losing streak in the Giants' waterfront ballpark with only their sixth win in the club's last 18 games in San Francisco.
Volstad retired the final 11 batters he faced and 16 of the last 17, allowing only Randy Winn's sixth-inning single during that span. The right-hander had gone seven innings four times this season and 8 2/3 was his previous high, on July 11 last year as a rookie against the Dodgers in his first career start.
"I was hoping that 8 2/3 in my debut wasn't going to be my longest outing," he said. "I felt like I was on a roll. I was able to throw my sinker whenever I needed to for strikes."
Teammate Cody Ross collected the game ball for Volstad as a keepsake, and the pitcher quickly packed it away safely in his bag.
He won't pitch again before the All-Star break, so this outing surely will provide some momentum heading into the second half.
"It's huge," Volstad said. "It's a good one to think about during the break."
Giants rookie Ryan Sadowski (2-1) allowed his first runs in his third big league start after pitching 16 scoreless innings to begin his career.
Uggla connected in the top of the ninth for his 16th homer and Jorge Cantu had two hits and drove in a run for Florida.
Sadowski struck out the side in order in the third but his streak ended in the fourth. He allowed a one-out single to Cantu followed by Jeremy Hermida's double. The right-hander then retired Ross on a called third strike, but John Baker followed with a sharp single to left. Winn fielded the ball and made a perfect throw home to get Hermida and save another run.
"A couple of soft-hit balls got through and they were able to put together some runs," Sadowski said. "I struggled with my command all day."
Sadowski's scoreless streak was the longest by a Giants pitcher to start his career since Al Worthington began with 19 in 1953. The 16 scoreless innings topped Hall of Famer Juan Marichal's mark of 15 to start his career in 1960 and also 15 by Dick LeMay in '61.
Sadowski received a warm ovation from the crowd when he walked off the mound after being replaced by Justin Miller in the sixth. He was tagged for five hits and three runs, two earned, with four strikeouts and four walks.
"He has great poise out there," manager Bruce Bochy said. "He keeps his focus. He doesn't get rattled. He was a little bit off, I think it's fair to say."
All-Star Hanley Ramirez missed his fourth straight game with a right hip flexor, though the Marlins aren't talking about placing him on the disabled list just yet. Still, his status to start for the National League in next week's All-Star Game in St. Louis appears uncertain.
He hopes to play Thursday at Arizona, thinking the heat might help him get loose and ready to return. The Marlins finish the first half with four games against the Diamondbacks.
The tides turned in Florida's favor after the Marlins were blanked 3-0 on Tuesday night on the Giants' majors-best 12th shutout of the season. It was the Marlins' third shutout, while the Giants were held without a run for the fourth time.
Nobody had more than one hit for San Francisco, which had won seven of 10.
Volstad, who lost to the Giants in his lone other appearance June 5, also had his sixth career hit with a ninth-inning single and scored two runs. He has three outings this year with no walks. ... Backup Eli Whiteside has been Sadowski's personal catcher after they worked together in the minor leagues. ... San Francisco missed out on its fourth three-game sweep at home this season. ... Triple-A INF Emmanuel Burriss will undergo left foot surgery Friday and miss two months. He has a broken baby toe.