0

SQL Server CE データベースの 2 つのテーブルから大量のデータ (約 65,000 行) を呼び出す vb.net アプリケーションがあります。

コードは非常に簡単です。

cmd.CommandText = "SELECT [Table1Col1], [Table1Col2], ... [Table1Col8], " & _
                  "[Table2Col1], [Table2Col2] FROM [Table1] LEFT JOIN [Table2] " & _
                  "ON [Table1].[LinkCol] = [Table2].[LinkCol] WHERE [Table1Col8] = 0 " & _
                  "ORDER BY [Table1].[LinkCol]"

reader = cmd.ExecuteReader()

Do While reader.read
     [read data, format it, etc]
Loop

このreader.readステートメントは、実行に最も時間がかかります。65,000 行を読み取って処理するのに約 2 時間かかりますが、その約 60 ~ 70% はreader.readステートメントの遅延によるものと推定されます。

これをスピードアップする方法はありますか?

編集:

いくつかの時間測定を行ったところ、reader.readステートメントは、読み取り、フォーマットなどのコードブロックよりも (平均で) 150 倍長くかかりました。

4

1 に答える 1

0

この問題は、SQL ステートメントの LEFT JOIN が原因であると思われます。テーブルごとに 1 つずつ、2 つのリーダーを実行し、それらをコード内で同期することで、大幅な速度向上を実現しました。次のようなもの:

cmd1.CommandText = "SELECT [LinkCol], [Table1Col1], [Table1Col2], ... [Table1Col8] " & _
                  "FROM [Table1] WHERE [Table1Col8] = 0 ORDER BY [Table1].[LinkCol]"

cmd2.CommandText = "SELECT [LinkCol], [Table2Col1], [Table2Col2] FROM [Table2] " & _
                  "ORDER BY [LinkCol]"

reader1 = cmd1.ExecuteReader() 
reader2 = cmd2.ExecuteReader()

Do While reader1.read
     tbl1ID = cint(reader1("LinkCol"))
     do while tbl1ID <> tbl2ID
         reader2.read()
         tbl2ID = cint(reader2("LinkCol"))
     loop
     [read data, format it, etc]
Loop

これは、エラーを回避し、リーダーが同期していることを確認するためのすべてのチェックを行わない単純化されたバージョンですが、結合された 2 つのテーブルで 1 つのリーダーを使用するとパフォーマンスの問題が発生するという同様の問題が発生した場合に役立つ可能性があります。

于 2015-11-11T22:10:28.710 に答える