更新记录时性能非常慢

时间:2012-06-22 16:19:13

标签: c# performance postgresql

我正在编写连接数据库的C#应用​​程序,选择并将记录插回网络中的服务器。

但我有大约40k的记录,我的程序处理一个记录,如1秒钟。

我不知道如何提高性能。这是我的sql getter和inserter。有什么建议吗?

    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 "";
    }

2 个答案:

答案 0 :(得分:3)

没有机会帮助您使用sql语句,因为我们不了解它们。

唯一(猜测)可见的问题是你每次尝试使用新连接循环40K记录(你知道怎么做)。这两个例程都是作为您的代码提供的。那么你需要40K调用insert_and_ConfirmSQL和/或另外40K来调用getString例程吗?

如果你真的循环,那么更新你的代码只使用一个连接而不关闭它;使用数据集可以完成相同的操作(您必须在使用前清除它:ds.Clear())。

毋庸置疑,如果您的查询很大(就数据而言)和/或索引不包含查询,那么预计会出现延迟。

尝试这种方法并告诉我们。

答案 1 :(得分:2)

有时您可以使用sql Datareader而不是DataSet来提高性能。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.100).aspx#Y0

然后,您可以在从数据库中读取数据时检查数据。

所以我用DataReader实现上面的代码并重新定时。

编辑:特别是那个getString方法。如果那个ds.Fill占用了40k行,这可能是你性能问题的原因。