C# 更新记录时性能非常慢
我正在编写我的C#应用程序,它连接到数据库,进行耦合选择,然后将记录插入网络中的服务器 但我有大约4万条记录,我的程序处理一条记录,大约1秒 我不知道如何提高性能。这是我的sql getter和inserter。有什么建议吗C# 更新记录时性能非常慢,c#,performance,postgresql,C#,Performance,Postgresql,我正在编写我的C#应用程序,它连接到数据库,进行耦合选择,然后将记录插入网络中的服务器 但我有大约4万条记录,我的程序处理一条记录,大约1秒 我不知道如何提高性能。这是我的sql getter和inserter。有什么建议吗 public bool insert_and_ConfirmSQL(String Query, String comments) { bool success = false; NpgsqlCommand cmd = new
public bool insert_and_ConfirmSQL(String Query, String comments)
{
bool success = false;
NpgsqlCommand cmd = new NpgsqlCommand();
NpgsqlConnection mycon = new NpgsqlConnection();
string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
mycon.ConnectionString = connstring;
cmd = mycon.CreateCommand();
cmd.CommandText = Query;
mycon.Open();
int temp = 0;
try
{
temp = cmd.ExecuteNonQuery();
success = true;
}
catch
{
success = false;
}
finally
{
if (mycon.State.ToString() == "Open")
{
mycon.Close();
}
}
return success;
}
public String getString(String sql, NpgsqlConnection conn)
{
using (DataSet ds = new DataSet())
{
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
{
da.Fill(ds);
if (ds.Tables.Count > 0)
{
DataTable dt = ds.Tables[0];
// check count of Rows
if (dt.Rows.Count > 0)
{
object o = dt.Rows[0][0];
if (o != DBNull.Value && o != null)
{
return o.ToString();
}
}
}
}
}
// Return default value
return "";
}
有时,您可以通过使用sql数据读取器而不是数据集来提高性能 然后,您可以在从数据库读取数据时检查数据 因此,我将使用DataReader实现上述代码并对其重新计时
编辑:尤其是getString方法。如果ds.Fill占用了40k行,则可能是性能问题的原因 有时,您可以通过使用sql数据读取器而不是数据集来提高性能 然后,您可以在从数据库读取数据时检查数据 因此,我将使用DataReader实现上述代码并对其重新计时
编辑:尤其是getString方法。如果ds.Fill占用了40k行,则可能是性能问题的原因 我们不知道sql语句,因此没有机会帮助您使用sql语句 唯一(猜测)可见的问题是,您每次都试图使用一个新连接循环40K条记录(您知道怎么做)。作为代码提供的两个例程都能做到这一点。那么,您是否需要40K调用来插入_和_ConfirmSQL和/或另40K调用getString例程 如果你真的循环,那么更新你的代码,只使用一个连接而不关闭它;对于数据集也可以这样做(使用前必须清除它:ds.clear() 不用说,如果您的查询很大(就数据而言),并且/或者索引没有覆盖查询,那么延迟是可以预料的
尝试使用这种方法并让我们知道。因为我们不知道sql语句,所以没有机会帮助您使用sql语句 唯一(猜测)可见的问题是,您每次都试图使用一个新连接循环40K条记录(您知道怎么做)。作为代码提供的两个例程都能做到这一点。那么,您是否需要40K调用来插入_和_ConfirmSQL和/或另40K调用getString例程 如果你真的循环,那么更新你的代码,只使用一个连接而不关闭它;对于数据集也可以这样做(使用前必须清除它:ds.clear() 不用说,如果您的查询很大(就数据而言),并且/或者索引没有覆盖查询,那么延迟是可以预料的
尝试使用这种方法并让我们知道。您是否分析了数据库以确定这是否是问题所在?请尝试使用SQL Management Studio之类的工具直接在数据库上执行这些查询。如果这些也很慢,那么您知道问题出在DB端。尽管1秒对于40k行的完整表扫描来说也是多余的。@romkyns-40000行对于一个典型的数据库来说不是什么。您是否分析了数据库以确定这是否是问题所在?请尝试直接在数据库上执行这些查询,使用类似SQL Management Studio的工具。如果这些也很慢,那么您知道问题出在DB端。虽然1秒对于40k行的完整表扫描来说也是多余的。@romkyns-40000行对于一个典型的数据库来说不是什么。