2011-12-30 11 views
1

私はMySQLで約1億レコードを含む大きなテーブルを持っています。 。非常に大きなテーブル(1億以上のレコード)から読み取った場合のMySqlDataReader.Read()の "タイムアウト"

string sql = "SELECT * FROM the_table"; 
MySqlCommand cmd = new MySqlCommand(sql, conn); 
MySqlDataReader rdr = cmd.ExecuteReader(); 
while (rdr.Read()) 
{ 
//... 
} 

しかし、3分間実行した後、タイムアウトの問題が発生します。 私はそれからすべてのレコードを読み、私のC#/ネットプログラムでそれらを処理したい、 はので、私はこのようないくつかのコードを書きました。 This is the error output:

私は "限界" を使用してSQLステートメントを変更する場合:

string sql = "SELECT * FROM the_table limit 60000000" //60 million 

を、それがOKに動作します。 (ループwhile (rdr.Read())は約3.8分かかりました)

テーブルが大きすぎるためにタイムアウトが発生しましたか?

ここでは何が起こっているのですか。どのように問題を解決できますか?

+2

なぜあなたはメモリに1億件のレコードを読ましようとしている?それはデータベースを持つことの目的を破り、ダムのストレージシステムに全体のSQLインフラストラクチャを削減するのに役立ちます。 –

+0

@MarcBはおそらくより正確ですが、とにかく*?の代わりにthe_tableから[onefield]を選択するとどうなりますか?おそらくsqlインフラストラクチャは完全に動作していますが、クライアントは単にメモリが不足しています... – rene

+0

実際には、それの部品データを選択します(テーブルの1つは質問に記載されている大きなテーブルです)。それから、「SELECT * FROM the_table」と書いたとしても、「タイムアウト」が発生することがわかりました。私は1つを修正することができれば、私は別のものを修正することができると思います。私は簡単な方法で質問します。 @MarcB – Hancy

答えて

1

OK、私はついにこの問題をローカライズしました!これは、問題が消えていた、そして、私はdotConnectを使用するように変更します。私は、MySQLが開発した「"ADO.NET Driver for MySQL (Connector/Net) を使用しているためだった。そして、いくつかのバグがあるかもしれません。すべての助けをありがとうございました。

+0

私はまったく同じ問題を抱えています。これはMySql.NETコネクタのバグですか?この機能を利用するには、ソフトウェアをさらに購入する必要はありません。 – mcmillab

0

私はそれ以上にコマンドタイムアウトを設定しています値と、それは問題を修正しました。

MySqlCommand mySqlCommand = new MySqlCommand(sql_cmd); 
mySqlCommand.Connection = _connection; 
mySqlCommand.CommandTimeout = 3600; 

希望これは

関連する問題