2009-07-18 2 views
4

DataSets может быть в 10 раз медленнее, чем DataReader при получении данных из БД. Я предполагаю, что это связано с накладными расходами DataSets, имеющими дело с отношениями и т. Д. Но есть разница в скорости между DataSets и DataReader из-за DataSets, из-за чего требуется получить больше данных (информацию об отношениях ...) из БД или из-за того, что приложение имеет сделать больше обработки, или и то, и другое?Является ли DataSet медленнее, чем DataReader из-за ...?

Я полагаю DataAdapter использует DataReader под капотом и, таким образом, количество применения команд нужно выполнить, чтобы извлечь 100 строк с DataAdapter равно или больше, чем количество команд приложения нужно выполнить, если эти 100 строк извлекаются непосредственно по DataReader. DataReader извлекает одну строку в то время или одно поле (определенной строки) за раз?

+0

Как вы знаете DataSets в 10 раз медленнее, чем DataReaders? Я не оценил разницу даже близко к этому числу, больше похоже на +/- 5% разницу. – nos

+0

У вас есть ссылка или какое-то доказательство для этого «10x»? –

+1

Независимо от деталей, в общем, DataReaders часто бывают немного быстрее (по моему опыту почти всегда намного больше, чем всего 5%, если ваш запрос фактически возвращает много строк, иначе это просто не имеет значения). Я не уверен, почему DataSets намного медленнее, и я полагаю, что это разумный вопрос. –

ответ

11

Есть несколько различных типов накладных расходов, которые могут возникнуть при использовании набора данных через DataReader:

DatSet содержат объекты DataTable, который содержит объект DataRow, которые содержат данные. Есть небольшие накладные расходы, создающие все объекты. Каждый DataRow обрабатывает все его значения как объекты, поэтому все типы значений вставляются в бокс, что добавляет немного накладных расходов для каждого поля.

Когда вы используете DataAdapter для заполнения DataSet, легко получить много данных, которые вы не будете использовать. Если вы не укажете, какие поля вы хотите, вы получите все поля, даже если вы не будете использовать их все. Если вы не фильтруете запрос, вы получите все строки из таблицы. Даже если вы позже фильтруете их с помощью DataView в DataTable, вы все равно их извлекли из базы данных. С DataReader вы ближе к запросу, который получает данные, поэтому соединение с тем, что вы получаете в результате, более очевидно.

Если вы извлекаете данные в несколько объектов DataTable в DataSet и используете отношения, чтобы DataSet объединил данные, вы делаете DataSet действительно работой, которую вы могли бы позволить базе данных делать, что более оптимизировано для нее.

Если вы хорошо используете DataSet, накладные расходы не так уж плохи, а скорее 30%, чем 1000%.

Правильно предположить, что DataAdapter использует DataReader. Если вы внимательно относитесь к использованию DataAdapter, операции с базой данных будут такими же, как если бы вы использовали DataReader самостоятельно.

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

+0

Благодарю всех вас за помощь – SourceC

1

Есть прочитанный из Why I Don't Use DataSets in My ASP.NET Applications Скотта Митчелла. Думаю, он охватывает важные моменты, которые вас интересуют.

+0

В этой статье показан очень невероятный график, демонстрирующий набор данных, поднимающийся с 1 до 10 секунд, поскольку количество результатов увеличилось с 100 до 1000. Честно говоря, маловероятно. – mrmillsy

4

A DataReader сродни прежней концепции ADO для набора записей только для прямого доступа.В наборе записей только для прямого доступа нет необходимости поддерживать какую-либо информацию указателя и, как таковой, всегда быстрее, чем традиционные DataSet экземпляров. Таким образом, A DataReader не кэширует данные и требует открытого подключения к базе данных для получения базовых данных.

Это объясняет, почему вам нужно написать следующий код для DataReader:

DataReader reader = GetANewDataReaderInstance(); 
while (reader.Read()) 
{ 
    ... 
} 

Теперь против в DataSet, все меняется довольно много. В сущности, вы можете вывести подмножество схемы базы данных в DataSet, такие как отношения таблиц, правила удаления и обновления и, конечно же, автоматическое переполнение строк внутри набора данных при отправке данных в хранилище данных. DataSets также может работать в режиме «отключен», что означает, что вы можете получить нужные данные и закрыть соединение с базой данных.

Резюме
Все эти функциональные возможности, однако приходит по цене: если вы хотите, чтобы заполнить пользовательские бизнес-объекты как можно быстрее, идти с DataReader ы в противном случае пойти с DataSet с.

1

Я предпочитаю использовать DataReader для заполнения списков.

Вы можете проверить мой вопрос, я недавно asekd об этом с хорошими комментариями/ответами:

Datasets

+0

thanx, сделаю это – SourceC

2

Будьте очень осторожны, что вы найдете в интернет-поиска. В статье вы вывесили говорит

приложение VB.NET написана с Release Candidate один из .NET

Это примерно семь лет назад!

Будьте уверены, чтобы увидеть что-то немного больше тока:

+0

+1 Прекрасно сделано - хороший глаз. –

Смежные вопросы