4

SqlXmlと、生データではなくxmlを返すストアドプロシージャを使用しています。返されたときに実際にデータを読み取る方法はxmlであり、列名を知りません。以下のバージョンを使用しましたが、序数を介してSqlDataReaderからデータを取得する方が、列名を使用するよりも高速であると聞いています。どちらが最善で、正当な理由または証拠があるかについてアドバイスしてください

  1. sqlDataReaderInstance.GetString(0);

  2. sqlDataReaderInstance[0];

4

3 に答える 3

7

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を維持します。これにより、パフォーマンスが向上します。

于 2011-10-20T05:53:42.447 に答える
4

ディスクからデータを取得する速度と比較すると、両方とも実質的に互いに同じ速度になります。

2つの呼び出しは同等ではありません。インデクサーを使用するバージョンはオブジェクトを返しますが、GetString()オブジェクトを文字列に変換し、これが不可能な場合(つまり、列がである場合DBNull)は例外をスローします。

したがって、GetString()少し遅くなる可能性がありますが、それを使用すると、とにかく文字列にキャストすることになります。

上記のすべてを考えると、私は使用しますGetString()

于 2011-10-20T05:39:33.290 に答える
1

Indexerメソッドは、ネイティブ形式でデータを返し、順序変数を使用するため、より高速です。

これらのスレッドを見てください:

  1. SqlDataReaderでパフォーマンスを最大化
  2. .NET SqlDataReader Item [] vs. GetString(GetOrdinal())?
于 2011-10-20T05:38:37.807 に答える