SqlDataReader - это два одинаковых. Какой из них быстрее - PullRequest
4 голосов
/ 20 октября 2011

Я работаю с SqlXml и хранимой процедурой, которая возвращает XML, а не необработанные данные.Как на самом деле читать данные, когда возвращается XML и не знает об именах столбцов.Я использовал приведенные ниже версии и слышал, что получение данных из SqlDataReader через ординал происходит быстрее, чем через имя столбца.Пожалуйста, совет, который является лучшим и с уважительной причиной или доказательством

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

Ответы [ 3 ]

6 голосов
/ 20 октября 2011

и слышал, что получение данных из SqlDataReader через порядковый номер быстрее, чем через имя столбца

Оба ваших примера получают данные через индекс (порядковый номер), а не имя столбца:

Получение данных через имя столбца:

while(reader.Read())
{
    ...
    var value = reader["MyColumnName"];
    ...
}

потенциально медленнее, чем получение данных через индекс:

int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
    ...
    var value = reader[myColumnIndex];
    ...
}

потому что первый пример должен повторно найти индекс, соответствующий «MyColumnName». Если у вас очень большое количество строк, разница может быть даже заметной.

В большинстве случаев разница не будет заметна, поэтому предпочтение читаемости.

UPDATE

Если вы действительно обеспокоены производительностью, альтернативой использованию ординалов является использование класса DbEnumerator следующим образом:

foreach(IDataRecord record in new DbEnumerator(reader))
{
    ...
    var value = record["MyColumnName"];
    ...
}

Класс DbEnumerator читает схему один раз и поддерживает внутреннюю таблицу HashTable, которая отображает имена столбцов по порядковым номерам, что может повысить производительность.

4 голосов
/ 20 октября 2011

По сравнению со скоростью получения данных с диска оба будут работать так же быстро, как и другие.

Два вызова не эквивалентны: версия с индексатором возвращает объект, тогда как GetString() преобразует объект в строку, вызывая исключение, если это невозможно (т. Е. Столбец равен DBNull).

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

Учитывая все вышесказанное, я бы использовал GetString().

1 голос
/ 20 октября 2011

Indexer метод быстрее, потому что он возвращает данные в собственном формате и использует порядковый номер.

Посмотрите на эти темы:

  1. Максимальная производительность с SqlDataReader
  2. .NET SqlDataReader Item [] и GetString (GetOrdinal ())?
...