Я не знаю, нужна ли вам петля. Если все, что вы делаете, это захватывает в maprec записи, которые соответствуют docrec, а затем то же самое для второй таблицы, то вы можете сделать это без цикла, используя синтаксис внутреннего соединения.
select columnlist from maprec m inner join docrec d on (m.filedyear = d.yearfield and m.volume = d.volume and m.page=d.page)
и снова для второго стола ...
Вы также можете урезать свои запросы, чтобы они возвращали только необходимые столбцы, а не возвращали все, если это возможно. Это должно помочь производительности.
Чтобы создать индекс самостоятельно в SQL Server 2005, перейдите к дизайну таблицы и выберите элемент панели инструментов Управление индексами и ключами.
Вы можете использовать помощник по настройке ядра СУБД. Вы можете создать трассировку (используя SQL Server Profiler) ваших запросов, а затем советник сообщит вам и создаст индексы, необходимые для оптимизации ваших запросов.
ОБНОВЛЕНИЕ ПОСЛЕ ВАШЕГО ПЕРВОГО КОММЕНТАРИИ МНЕ:
Вы все еще можете сделать это, выполнив первый запрос, затем второй и третий без цикла, как я показал выше. Вот трюк. Я думаю, вам нужно связать первое со вторым и третьим, поэтому вы сделали петлю.
Прошло много времени с тех пор, как я сделал наборы записей VB6, НО я вспоминаю возможность фильтровать набор записей после возвращения из БД. Таким образом, в этом случае вы можете сохранить цикл, но вместо того, чтобы вызывать SQL каждый раз в цикле, вы просто фильтруете результирующие данные набора записей на основе первой записи. Вы бы инициализировали / загрузили второй и третий запрос перед этим циклом для загрузки данных. Используя приведенный выше синтаксис, я загружу в каждую из этих таблиц соответствие родительской таблице (docrec).
При этом вы по-прежнему только трижды попадете в БД, но при этом сохраните цикл, необходимый для обхода родительской таблицы docrec, чтобы вы могли работать над ней И с дочерними таблицами, когда у вас есть совпадение.
Вот несколько ссылок по фильтрации наборов записей ado ....
http://www.devguru.com/technologies/ado/QuickRef/recordset_filter.html
http://msdn.microsoft.com/en-us/library/ee275540(BTS.10).aspx
http://www.w3schools.com/ado/prop_rs_filter.asp
С учетом всего сказанного .... У меня возникло странное ощущение, что, возможно, это можно было бы решить с помощью левого соединения на ваших столах?
select * from docrec d
left join maprec m on (d.YearFiled= m.FiledYear and d.Volume = m.Volume and d.Page = m.Page)
left join names n on (d.YearFiled = n.YearFiled and d.Volume = n.Volume and d.Page = n.Page)
это вернет все записи DocRec И добавит все значения maprec и имена, где оно соответствует ИЛИ NULL, если нет.
Если это соответствует вашим потребностям, он попадет в БД только один раз.