Как перебирать большой набор результатов SQL с несколькими связанными таблицами

Я извлекаю очень большое количество записей с несколькими наборами результатов из SQL Server в свой проект .NET 3.5.

Я не могу просто собрать их все в DataSet и работать с ними, так как это займет слишком много памяти. Мне не нужно извлекать все записи как один раз, а только одну запись в родительской таблице, а затем связанные с ней дочерние записи.

Я мог бы сделать это с помощью DataReader, но меня беспокоит то, что процесс повторения всех записей займет много часов. Это означает, что DataReader останется открытым на все те часы, которые я не думаю возможным.

Как обработать записи, когда извлечение всех записей в DataSet невозможно из-за их большого количества, но использование DataReader потребует, чтобы он был открыт в течение многих часов?


person user31673    schedule 01.04.2012    source источник


Ответы (1)


Один из способов решения этой проблемы — разбивать данные и обрабатывать их по частям, сохраняя при этом информацию о последней обработанной записи.

Таким образом, если соединение с базой данных потеряно, вам не нужно начинать заново, но вы можете продолжить с последней «контрольной точки» (вы можете сохранять контрольную точку после каждой записи, если это имеет смысл).

Если обработка каждой загруженной записи занимает много времени, имеет смысл использовать DataTable для загрузки небольшого фрагмента данных в память, обработки и продолжения (это улучшает использование ресурсов БД). Но если обработка быстрая и основное время уходит на загрузку данных из БД, то разумнее использовать DataReader (для экономии памяти).

person surfen    schedule 01.04.2012
comment
Как долго вы можете оставлять DataReader открытым? - person user31673; 01.04.2012
comment
Я не думаю, что есть какой-то предел. Может быть некоторое ограничение по времени на бездействующие соединения, но если вы активно его используете, то оно должно работать до тех пор, пока не произойдет какая-либо ошибка сети или сервера базы данных. Если это произойдет, вы должны попытаться открыть новое соединение и продолжить. - person surfen; 01.04.2012