SqlXmlと、生データではなくxmlを返すストアドプロシージャを使用しています。返されたときに実際にデータを読み取る方法はxmlであり、列名を知りません。以下のバージョンを使用しましたが、序数を介してSqlDataReaderからデータを取得する方が、列名を使用するよりも高速であると聞いています。どちらが最善で、正当な理由または証拠があるかについてアドバイスしてください
sqlDataReaderInstance.GetString(0);sqlDataReaderInstance[0];
SqlXmlと、生データではなくxmlを返すストアドプロシージャを使用しています。返されたときに実際にデータを読み取る方法はxmlであり、列名を知りません。以下のバージョンを使用しましたが、序数を介してSqlDataReaderからデータを取得する方が、列名を使用するよりも高速であると聞いています。どちらが最善で、正当な理由または証拠があるかについてアドバイスしてください
sqlDataReaderInstance.GetString(0);
sqlDataReaderInstance[0];
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を維持します。これにより、パフォーマンスが向上します。
ディスクからデータを取得する速度と比較すると、両方とも実質的に互いに同じ速度になります。
2つの呼び出しは同等ではありません。インデクサーを使用するバージョンはオブジェクトを返しますが、GetString()オブジェクトを文字列に変換し、これが不可能な場合(つまり、列がである場合DBNull)は例外をスローします。
したがって、GetString()少し遅くなる可能性がありますが、それを使用すると、とにかく文字列にキャストすることになります。
上記のすべてを考えると、私は使用しますGetString()。
Indexerメソッドは、ネイティブ形式でデータを返し、順序変数を使用するため、より高速です。
これらのスレッドを見てください: