3

私は現在、古いデータベースを新しいスタイルに変換するプログラムに取り組んでおり、割り当てられたタスクの 1 つは、古いバイナリ列をいくつか削除して、リポジトリ内のドキュメントに変換することです。

テーブルには約 110 万行あり、私のプロセスは完了するまでに約 12 時間かかります。

私はこれをすべて少し速くする方法を探しています。私が見ていることの 1 つは、データをより速く取得することです。クエリが完了する前にクエリの結果を取得する方法があれば教えてください。Query Analyzer でこのテーブルに対して "select *" ステートメントを実行すると、すぐに結果が返されるようになりますが、.NET で ExecuteReader を使用すると、そのクエリで行の読み取りを開始するまでに約 30 分かかるようです。 .

4

2 に答える 2

1

を使用すると役立つ場合がありますcommand.ExecuteReader(CommandBehavior.SequentialAccess)。ただし、これを行うには、列を順番に読み取る必要があり、バイナリ値を別の方法で読み取る必要があります。SequentialAccess のドキュメントを読むことをお勧めします。これにより、コードに他にどのような変更を加える必要があるかがわかります。

同じクエリがクエリ アナライザで即座に実行されるとします。これは、クエリが最初の結果を返すのに本質的に 30 分もかからないこと、またはクエリ アナライザーでそうであることを示しています。大きなバイナリ値の処理が、この不一致の説明になる可能性が高いと思います。テストする簡単な方法の 1 つは、バイナリ列を除くすべてを選択するようにクエリを変更し、それによって ExecuteReader にかかる時間が変わるかどうかを確認することです。実行時間がバイナリ列なしで同じである場合、SequentialAccess が役立つ可能性は低いです。バイナリ列を使用しない方が高速な場合は、 SequentialAccess を使用する価値があります。

于 2011-01-12T23:44:03.157 に答える
0

クエリですべての列が必要ない場合は、select * を使用しないことをお勧めします。おそらく、この質問も役立つでしょう:最後の手段のパフォーマンス最適化戦略

于 2011-01-12T23:42:40.100 に答える