Я бы применил подход «производитель-потребитель» (http://en.wikipedia.org/wiki/Producer-consumer_problem):
)
Один поток запрашивает вашу базу данных (если возможно, с помощью какого-либо курсора, чтобы вы могли сделать это один за другим) и помещает каждую строку в буфер.
Другой поток (или, может быть, больше, чем один, если поиск требует действительно большой обработки), получает одну строку базы данных (с вашим HTML-объектом) и обрабатывает поиск.
В этом случае вы можете одновременно выполнять запросы и обработку.
Я не верю, что вы получите большую выгоду от одного факта, что весьма вероятно, что ваши запросы занимают намного больше времени, чем обработка. Проблема в том, что у запрашивающей части чтение диска является узким местом. В конце концов, скорее всего, именно ваша производительность диска ограничит вашу общую производительность.
Чтобы проверить, так ли это, вы могли бы сделать производителя / потребителя более чем с одним производителем (то есть более чем одним потоком, запрашивающим базу данных).
Надеюсь, это поможет.
Эдуардо