2012-01-18 13 views
0

私はAccess DB上で実行する必要がある膨大なクエリを持っています。私は一度にクエリを実行することができないため、forループを使用しようとしています(50kの値を持つINがあります)。読者は、あらゆる種類の問題を抱えています。たいていの場合、forループを50〜10000の値に分割すると、リーダーは400(正確には400)の値を読み取ってから約3分間停止し、次に100分かけてハングアップします。クエリごとに10k個以上の値を設定すると、2696に達してハングアップし、1kかそれ以上のハングアップが発生します。私は実際にはODBC、SQLまたはそのタイプのデータベースのどのタイプでも働いたことがないので、何か愚かでなければならない、またはこれが期待されますか?たぶんこのようなことをするより良い方法がありますか?ここでループしている私のコードだ:ODBCDataReaderはランダムにハングアップしますか?

//connect to mdb 
OdbcConnection mdbConn = new OdbcConnection(); 
mdbConn.ConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\PINAL_IMAGES.mdb;"; 
mdbConn.Open(); 

OdbcCommand mdbCmd = mdbConn.CreateCommand(); 
mdbCmd.CommandText = @"SELECT RAW_NAME,B FROM 026_006_886 WHERE (B='CM1' OR B='CM2') AND MERGEDNAME IN" + imageChunk; 
OdbcDataReader mdbReader = mdbCmd.ExecuteReader(); 

while (mdbReader.Read()) 
{ 
    sw.WriteLine(@"for /R %%j in (" + mdbReader[0] + @") do move %%~nj.tif .\" + mdbReader[1] + @"\done"); 
    linesRead++; 
    Console.WriteLine(linesRead); 
} 
mdbConn.Close(); 

ここで私はStreamReaderをを使用して、テキストファイルからの値ラインと5000本のラインを読むことによって、IN用imageChunk変数を移入方法は次のとおりです。

   string imageChunk = "("; 
       for (int j = 0; j < 5000; j++) 
       { 
        string image; 
        if ((image = sr.ReadLine()) != null) 
        { 
         imageChunk += @"'" + sr.ReadLine() + @"',"; 
        } 
        else 
        { 
         break; 
        } 
       } 
       imageChunk = imageChunk.Substring(0, imageChunk.Length - 1); 
       imageChunk += ")"; 
+0

なぜあなたは50Kの値を持つINを持っていますか?なぜこれはテーブルにないのですか? – Fionnuala

+0

私は冗談だから!あなたはDataTableを参照していますか? – stereotypeaura

+0

いいえ、私はそうではありません。私はAccessのテーブルを参照しています。多くの値に対してINを使用するのは賢明ではありません。テーブルの結合が必要です。 – Fionnuala

答えて

0

データアダプタを使用して終了しました...遅いですが、フリーズする代わりに一定のフィードバックを提供しました。なぜか本当に良い答えは得られませんでしたが、大きなクエリを実行するよりスマートな方法について助言を得ました。

+0

あなたの遅さはおそらく、効率の悪いアダプタ(または多くのレコード)よりも非効率なクエリと関連しています。 50kの値が完全に戻るまでに1分もかかりません。クエリをコードに入れる前に、データに対して直接クエリを実行することをお勧めします。これはどのように行うのかはわかりませんが、SQLではSQL Management Studioを使用してクエリをテストする場合があります。 – EtherDragon

0

への接続は、 DBとクエリーの実行は私にとっては大丈夫なようです。私はあなたがクエリを複数回実行しているので、 "ぶら下がっ"が来ていると思われます。速度のためのヒントのカップル。列BとMergedNameには索引が必要です。データテーブル構造を再作成することでスピードも向上する可能性があります。 MergedNamesは本当にランダムですか?もしそうなら、あなたはおそらくあなたのスピードにこだわっているでしょう。 @Remouが示唆しているように、私はMergedNamesリストをテーブルにアップロードした後、結果を得るためにテーブルに参加し、完了時にテーブルを削除するという合計実行時間も比較します。

+0

クエリを1回以上実行する場合は、テーブルを削除するよりもレコードを削除する方がよいでしょう。 – Fionnuala

関連する問題