我是Npgsql的新手。我正在尝试将此用于Windows应用程序,我们的要求是减少将200到300万行插入客户端的本地/嵌入式DB文件所需的时间,目前需要3分钟才能插入200万行在SQLite中,如果我们每批交易60000批次。我已经尝试使用NpgsqlDataAdapter(下面粘贴的代码片段),但是插入一批60000行需要大约20秒,而SQLite需要2到3秒的时间。任何人都可以帮我使用COPY FROM STDIN从内存数据结构中插入数据(而不是从text / csv文件中插入)。
var connection = new NpgsqlConnection(connStr);
connection.Open();
NpgsqlCommand cmd = new NpgsqlCommand() { CommandType = "INSERT INTO Logs (c1,c2,c3,c4) VALUES (@c1,@c2,@c3,@c4)" };
NpgsqlDataAdapter da = new NpgsqlDataAdapter { InsertCommand = cmd };
if (da.InsertCommand != null)
da.InsertCommand.Connection = connection;
NpgsqlParameter c1= da.InsertCommand.Parameters.Add("@c1", NpgsqlTypes.NpgsqlDbType.Integer);
c1.SourceColumn = "c1";
c1.SourceVersion = DataRowVersion.Current;
NpgsqlParameter c2= da.InsertCommand.Parameters.Add("@c2", NpgsqlTypes.NpgsqlDbType.Integer);
c2.SourceColumn = "c2";
c2.SourceVersion = DataRowVersion.Current;
NpgsqlParameter c3= da.InsertCommand.Parameters.Add("@c3", NpgsqlTypes.NpgsqlDbType.Integer);
c3.SourceColumn = "c3";
c3.SourceVersion = DataRowVersion.Current;
NpgsqlParameter c4= da.InsertCommand.Parameters.Add("@c4", NpgsqlTypes.NpgsqlDbType.Date);
c4.SourceColumn = "c4";
c4.SourceVersion = DataRowVersion.Current;
da.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
da.InsertCommand.Prepare();
NpgsqlTransaction trans = connection.BeginTransaction();
DataTable logEventsTable =
this.ConvertToLogEventsDataTable(logEvents, areNewLogs);
logEventsTable.Locale = CultureInfo.CurrentCulture;
insertCount = da.Update(logEventsTable);
trans.Commit();
trans.Dispose();
da.Dispose();
logEventsTable.Clear();
connection.Close();
答案 0 :(得分:1)
我找到了一些链接,解释了如何使用NpgsqlCopyIn和NpgsqlCopySerializer实现批量插入。这肯定比使用NpgsqlDataAdapter更好。与使用交易进行插入相比,我获得的时间缩短了100%。
http://devcrackers.blogspot.in/2013/06/npgsqlcopyin-and-npgsqlcopyserializer.html
https://gist.github.com/smoothdeveloper/0c5c0f6bbdad8b3b18af