SqlDataReaderから序数を介してデータを取得する方が、列名を使用するよりも高速であると聞いています
どちらの例も、列名ではなく、インデックス(序数)を介してデータを取得しています。
列名からデータを取得する:
while(reader.Read())
{
...
var value = reader["MyColumnName"];
...
}
インデックスを介してデータを取得するよりも潜在的に遅い:
int myColumnIndex = reader.GetOrdinal("MyColumnName");
while(reader.Read())
{
...
var value = reader[myColumnIndex];
...
}
最初の例では、「MyColumnName」に対応するインデックスを繰り返し検索する必要があるためです。行数が非常に多い場合は、違いが顕著になることもあります。
ほとんどの場合、違いは目立たないので、読みやすさを優先します。
アップデート
パフォーマンスが本当に心配な場合は、序数を使用する代わりに、次のようにDbEnumeratorクラスを使用することもできます。
foreach(IDataRecord record in new DbEnumerator(reader))
{
...
var value = record["MyColumnName"];
...
}
このDbEnumerator
クラスはスキーマを1回読み取り、列名を序数にマップする内部HashTableを維持します。これにより、パフォーマンスが向上します。