3


0

GuidからSQL互換文字列を取得するより高速な方法

アプリケーションをプロファイリングしているときに、この特定のコード行に気付きました(生データを処理することにより、データベース挿入のボートロードを作成します)。

myStringBuilder.AppendLine(
    string.Join(
        BULK_SEPARATOR, new string[]{myGuid.ToString() ...

結果の文字列がTSQLコマンド「BULK INSERT」を介して呼び出されるファイルになることを念頭に置いて、このステップをより速く行う方法はありますか? バイト配列を取得する方が速いことは知っていますが、それをファイルにプラグインすることはできません。

3 Answer


2


最速の_and_最も簡単な方法は、生のファイルで `BULK INSERT`をまったく使用しないことです。 代わりに、http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx [SqlBulkCopy]クラスを使用してください。 中間ファイルを使用する代わりに、パイプを介してデータを直接送信することにより、これを大幅に高速化する必要があります。

(文字列を変換せずに「Guid」を直接使用することもできますが、「SqlBulkCopy」が内部で何を行うかについては100%確信できません。)


0


GUIDの取得元を示しているわけではありません。 また、GuidクラスのToStringメソッドが既に行っていることを行い、バイトを反復処理して文字列値に変換するため、バイトの取得が速くなるとは思わない。

むしろ、パフォーマンスの観点からこのコードを改善できる可能性のあるいくつかの一般的な領域があると思います(これをループで行うと仮定します)

  • の新しい繰り返しでmyStringBuilderインスタンスを再利用していますか あなたのループ? Length(not Capacity)プロパティを0に設定し、それを使用して文字列を再構築する必要があります。 これにより、新しいStringBuilderインスタンスをウォームアップする必要がなくなり、より大きな文字列のメモリ割り当てが既に行われます。

  • String.Joinを呼び出す代わりに、myStringBuilderでAppendの呼び出しを使用します。 String.Joinは、一連のメモリを事前に割り当ててから、再度割り当てる(最初の反復の場合)または既に割り当てられているスペースにコピーする文字列インスタンスを返します。 これを2回行う理由はありません。 代わりに、作成している配列を繰り返し処理し(またはループを展開し、固定サイズの配列があるようです)、Appendを呼び出して、guidを渡してからBULK_SEPARATORを渡します。 実際にGUIDを追加した場合は、末尾から1文字を削除するほうが簡単です。実際には、StringBuilderのLengthプロパティを1つ減らすだけです。


0


時間が重要な場合-十分に長いGUIDのリストを事前に作成して文字列に変換してから、コードで使用できますか? 要件に応じて、C#またはSQL Serverのいずれかを使用しますか?