Есть несколько различных типов накладных расходов, которые могут возникнуть при использовании набора данных через DataReader:
DatSet содержат объекты DataTable, который содержит объект DataRow, которые содержат данные. Есть небольшие накладные расходы, создающие все объекты. Каждый DataRow обрабатывает все его значения как объекты, поэтому все типы значений вставляются в бокс, что добавляет немного накладных расходов для каждого поля.
Когда вы используете DataAdapter для заполнения DataSet, легко получить много данных, которые вы не будете использовать. Если вы не укажете, какие поля вы хотите, вы получите все поля, даже если вы не будете использовать их все. Если вы не фильтруете запрос, вы получите все строки из таблицы. Даже если вы позже фильтруете их с помощью DataView в DataTable, вы все равно их извлекли из базы данных. С DataReader вы ближе к запросу, который получает данные, поэтому соединение с тем, что вы получаете в результате, более очевидно.
Если вы извлекаете данные в несколько объектов DataTable в DataSet и используете отношения, чтобы DataSet объединил данные, вы делаете DataSet действительно работой, которую вы могли бы позволить базе данных делать, что более оптимизировано для нее.
Если вы хорошо используете DataSet, накладные расходы не так уж плохи, а скорее 30%, чем 1000%.
Правильно предположить, что DataAdapter использует DataReader. Если вы внимательно относитесь к использованию DataAdapter, операции с базой данных будут такими же, как если бы вы использовали DataReader самостоятельно.
DataReader будет извлекать запись за раз из базового драйвера базы данных, который, в свою очередь, будет получать буфер, заполненный записями за раз из базы данных. Если записи очень велики, то по одному в буфер может входить только по одному, но обычно в буфере есть десятки записей или даже сотни, если они действительно маленькие.
Как вы знаете DataSets в 10 раз медленнее, чем DataReaders? Я не оценил разницу даже близко к этому числу, больше похоже на +/- 5% разницу. – nos
У вас есть ссылка или какое-то доказательство для этого «10x»? –
Независимо от деталей, в общем, DataReaders часто бывают немного быстрее (по моему опыту почти всегда намного больше, чем всего 5%, если ваш запрос фактически возвращает много строк, иначе это просто не имеет значения). Я не уверен, почему DataSets намного медленнее, и я полагаю, что это разумный вопрос. –