0

MySql テーブルに 90Mb のデータを挿入する必要があり、重複キーの例外を回避するために INSERT IGNORE コマンドを使用しています。パフォーマンスは 1 秒間に 8 レコードですが、非常に遅いようです。私はそれを速くすることができますか?

ps SQLコンパクトデータベースからデータを読み取ったため、レコードごとにレコードを挿入しています

using (SqlCeConnection sqlConnection = new SqlCeConnection(connectionstrCe))
            {
                sqlConnection.Open();
                SqlCeCommand cmdCe = sqlConnection.CreateCommand();
                {
                    {

                        mySQLConnection.Open();

                        foreach (KeyValuePair<string, List<string>> t in tablesCeNames) //reading the tables property from the dictionary - column names and datatypes
                        {

                            string tableData = t.Key; 
                            List<string> columnData = t.Value;
//get the values from the table I want to transfer the data
                                cmdText = "SELECT * FROM " + tableData;
//compose the mysql command
                                cmdCe.CommandText = cmdText;

                                SqlCeDataReader dataReader = cmdCe.ExecuteReader(); //read
//InsertTable is a method that get the datareader and convert all the data from this table in a list array with the values to insert
                                inputValues = InsertTables(dataReader);


                                MySql.Data.MySqlClient.MySqlTransaction transakcija;
                                transakcija = mySQLConnection.BeginTransaction();

                                worker.ReportProgress(4, inputValues.Count);

                                foreach (string val in inputValues)//foreach row of values of the data table
                                {
                                    cmdSqlText = "INSERT IGNORE INTO " + tableData + "("; //compose the command for sql

                                    foreach (string cName in columnData)  //forach column in a table
                                    {
                                        string[] data = cName.Split(' ');
                                        if (!data[0].ToString().Equals("Id"))
                                        {
                                            cmdSqlText += data[0].ToString() + ","; //write the column names of the values that will be inserted  
                                        }
                                    }
                                    cmdSqlText = cmdSqlText.TrimEnd(',');
                                    cmdSqlText += ") VALUES (";
//val contains the values of this current record that i want to insert
                                    cmdSqlText += val;  //final command with insert ignore and the values of one record
                                    if (!val.Equals(""))
                                    {
                                        try
                                        {
                                            new MySql.Data.MySqlClient.MySqlCommand(cmdSqlText, mySQLConnection, transakcija).ExecuteNonQuery(); //execute insert on sql database
                                            WriteToTxt("uspješno upisano u mysql" + t.Key);
                                        }
                                        catch (MySql.Data.MySqlClient.MySqlException sqlEx)
                                        {
                                        }
                                    }
                                }

                                if (TablicaSveOK)
                                {
                                    transakcija.Commit();

                                }
                                else
                                {
                                    transakcija.Rollback();
                                }
                            }
                        }

                        if (mySQLConnection.State != System.Data.ConnectionState.Closed)
                        {
                            mySQLConnection.Close();
                        }
                    }
4

3 に答える 3

1

Sql からファイルにデータを取得し、LOAD DATA を使用するのはどうですか?

http://dev.mysql.com/doc/refman/5.0/es/load-data.html

于 2013-08-01T09:06:01.240 に答える
0

最新の MySql.Connector には、より NET 指向の方法で MySql の LOAD DATA 構文を呼び出すために使用できるMySqlBulkLoaderというクラスがあります。このクラスは、読み込み元のコンマ区切り値ファイルを必要とし、非常に高速です。

したがって、あなたの仕事は、データテーブル内のすべての Sql Compact レコードを読み取り、ストリームライターまたは特殊な CSV ライターを使用してファイル内のすべてを書き留めることです。

次に、MySql テーブルにデータをロードするコードは次のように単純です。

string connStr = "server=localhost;user=root;database=........";
using(MySqlConnection conn = new MySqlConnection(connStr))
{
     MySqlBulkLoader bl = new MySqlBulkLoader(conn);
     bl.TableName = "yourdestinationtable";
     bl.FieldTerminator = "\t";
     bl.LineTerminator = "\n";
     bl.FileName = "path_to_your_comma_separated_value_file";
     try
     {
        conn.Open();
        int count = bl.Load();
     }
}
于 2013-08-01T09:14:38.857 に答える
0

複数の呼び出しを送信する代わりに、1 つの呼び出しを送信してすべてのレコードを挿入できます。こんな感じで挿入

insert into your table(col1, col2)
SELECT 'Name1', 'Location1' 
UNION ALL
SELECT 'Name2', 'Location2'
UNION ALL
SELECT 'Name3', 'Location3'

これからの一部は、挿入ステートメントではなく、コードがボトルネックである可能性があります。そのため、まず問題がどこにあるのかを確認してから、解決策を探すことをお勧めします。

于 2013-08-01T09:08:04.007 に答える