Duncan had 21 points and 12 rebounds, and McDyess added 15 points and 14 boards as the Spurs won for the first time in five games away from home.
The Rockets were doomed by a 7 1/2-minute scoring drought to start the third quarter, when the Spurs forced them into 16 consecutive misses after halftime.
"That was kind of the difference, gave us a little bit of breathing room," Duncan said. "Defensively, a very good quarter for us."
Luis Scola had 18 points and 12 rebounds, and Trevor Ariza added 17 points and a season-high 11 rebounds for Houston. The Rockets shot 36 percent from the field (33 of 92) for the game and finished with a season-low point total.
"We had shots at the basket, we had open jumpers, we had opportunities," Houston coach Rick Adelman said. "But I looked up there and they had scored 12 straight points and it was over a matter of minutes. We kept missing."
Still, Houston had a chance to rally after Carl Landry grabbed an offensive rebound over Duncan to make it 86-84 with 40.5 seconds left.
Hill got up with a bloody nose, but made the resulting free throws with 28 seconds left. He left the court immediately after hitting the second shot, and the Spurs held on from there.
"We really let them back into that fourth [quarter]," Duncan said. "There are a lot of things to work on, but a good win for us, good to sustain that lead and pull it out."
The Spurs went 26 of 34 from the free throw line and beat Houston for the 13th time in the last 19 meetings.
San Antonio missed 10 of its first 14 shots and Houston took the early lead. Ariza and Scola scored all 23 of the Rockets' first-quarter points on 10-for-17 shooting -- the rest of the team went 0-for-7.
Lowry was the third Rocket to score, sinking free throws with 11:06 left in the half to give Houston a 25-19 lead. The Spurs then mounted a quick 12-3 run with five reserves on the floor to take their first lead.
Brooks scored all seven of his first-half points in the last 90 seconds, driving for a layup just before the horn to put the Rockets ahead 46-44 at the break.
The Spurs opened the second half with a 14-0 run as Houston lost its shooting touch. Scola's jumper from the foul line ended the Rockets' drought with 4:37 left in the third quarter and cut the Spurs' lead to 58-48.
The Rockets missed 20 of 24 shots and mustered only 12 points in the third quarter, a season low.
"We couldn't get it in the basket," Scola said. "We were playing decent. We were moving the ball, we were taking the shots that we wanted to, they just didn't want to go in. It was very frustrating."
The Spurs coughed up six turnovers in the first seven minutes of the final quarter and the Rockets closed the gap to three. Duncan hit a running one-hander and a free throw to put the Spurs ahead 82-76.
"We missed some easy shots," Parker said. "They did a good job playing defense and got right back. Then, we had to play some good defense and hit our free throws to win the game."
Lowry lost the ball on Houston's next possession and McDyess swished a jumper from the baseline with 1:45 left, prompting fans to head for the exits. Those fans missed the tense final moments, when the Spurs' offense bogged down and the Rockets made one last push.
Rockets F Shane Battier did not score, ending his streak of games with a 3-pointer at 27. ... Duncan recorded his seventh double-double of the season. ... Ariza went 4 for 10 from the field in the first quarter, but finished 6-for-21. ... Spurs G Manu Ginobili missed his fifth straight game with a strained groin. Coach Gregg Popovich said Ginobili may return for Sunday's game against Philadelphia.