我在C#中有DataSet
DataTables
和PostgreSQL数据库有相同的表。我在我的代码中填写DataTable
并想要INSERT
DataTable到Postgresql DataBase。我尝试使用简单的SQL查询(INSERT INTO...
)插入它,但如果我有数千行的数百个表,它会非常慢。我想,使用DataAdapter会提高性能,但我不明白,它是如何工作的。你可以在两个案例中解释我吗?
情形1: 使用DataAdapter将DataSet的表插入Postgresql
情况2: 仅将Dataq中的uniq值插入PostgreSQL(如果数据库中的表具有带uniq键的行且DataTable包含相同的行)
或许你可以建议阅读什么来学习DataAdapters ...无论如何,谢谢。
答案 0 :(得分:0)
除了非常小的数据集之外,你将很难击败NpgSql的copy
实现的性能,这可以通过{{1}的BeginTextImport
方法实现。对象。
因此,无论您的应用程序中的数据如何存在,如果您通过文本导入(复制)转储输出,它应该非常活泼。以下是如何使用数据表执行此操作的示例。请记住数据表中的列和表中的列必须排成一行 - 如果没有,则需要管理这种方式或其他方式。
这预示着NpgSql 3.1.9或更高版本。
NpgSqlConnection
至于重复...哇,这真的取决于。定义“重复”。如果它只是“选择不同”,那么它还取决于您期望的重复数量。如果它是一个小数量,object[] outRow = new object[dt.Columns.Count];
using (var writer = conn.BeginTextImport("copy <table> from STDIN WITH NULL AS '' CSV"))
{
foreach (DataRow rw in dt.Rows)
{
for (int col = 0; col < dt.Columns.Count; col++)
outRow[col] = rw[col];
writer.WriteLine(string.Join(",", outRow));
}
}
可能就足够了,但如果你有大量的dupes,一个Dictionary对象会使每次查找更有效率。典型的List查找是O(n),而Dictionary查找是O(1)。
这是上面例子中字典不同插入的一个非常强大的例子:
List.Exists<>
免责声明:这是记忆猪。如果您可以通过任何其他方式管理欺骗,或保证数据的排序,还有许多其他选项。
如果您不能(或不会)使用批量复制插入,那么有助于提高性能的是将插入包装到事务(object[] outRow = new object[dt.Columns.Count];
Dictionary<string, bool> already = new Dictionary<string, bool>();
bool test;
using (var writer = conn.BeginTextImport("copy <table> from STDIN WITH NULL AS '' CSV"))
{
foreach (DataRow rw in dt.Rows)
{
for (int col = 0; col < dt.Columns.Count; col++)
outRow[col] = rw[col];
string output = string.Join(",", outRow);
if (!already.TryGetValue(output, out test))
{
writer.WriteLine(output);
already.Add(output, true);
}
}
}
)中,但对于数十万行,我不明白你为什么会这样。