数据库更新效率测试

发布时间 2023-09-14 19:42:47作者: 81

有个项目记录采集点的实时数据(mysql5.7),约5000条记录,在C#的DataTable更新好后,一次性Update到表中,但速度非常慢要4分钟左右,但程序定时更新为5分钟,经常超时,也找不到好的办法,最后把这个表改为Memory引擎后速度提高到5秒左右,总算解决了问题。

因为此,在本机做了些测试,为以后的数据库选型做个准备,以下是测试结果:

  

 结论:

1. 无论插入还是更新,mssql是王者,更新5000条记录1s内解决。

2. 其他数据库的更新基本都在5s左右,差别不明显

3. 如果使用maridb或mysql等,使用Memory引擎做这种实时缓存是个很好的选择。

4. 在本机测试时,我把mysql57的内存参数调高,但效果不明显。

5. 生产机和我本机测试都是mysql5.7,但生产机的服务器明显不如我的PC机,无论InnoDB还是Memory引擎,未分析具体原因。

6. 对这些临时保存的数据,大量更新时不如全部删除,再插入,耗时只有1/10左右。

 

 

插入时代码示例:

//mssql转pgsql15.3
            //插入5000条为4997ms
            Stopwatch sw = new Stopwatch();
            sw.Start();
            string cnstr = @"server=.\sql2016;database=test;uid=sa;password=st#";
            string sql = "select * from aqgl_zy_position2023";
            SqlDataAdapter da = new SqlDataAdapter(sql, cnstr);
            DataTable dt = new DataTable();
            da.Fill(dt);

            foreach (DataRow dr in dt.Rows)
                dr.SetAdded();

            string cnstr1 = @"server=localhost;database=testdb;uid=postgres;password=st#";
             Npgsql.NpgsqlDataAdapter da2 = new Npgsql.NpgsqlDataAdapter(sql, cnstr1);
            Npgsql.NpgsqlCommandBuilder b = new Npgsql.NpgsqlCommandBuilder(da2);
            da2.Update(dt);
            long t1 = sw.ElapsedMilliseconds;
            this.textBox2.Text = t1.ToString();

 

更新时代码:

//UpdateBatchSize=0不支持
            //UpdateBatchSize=1时,513/5465
            //UpdateBatchSize=5001不支持
            Stopwatch sw = new Stopwatch();
            sw.Start();
            string cnstr = @"server=localhost;database=testdb;uid=postgres;password=st";
            string sql = "select * from aqgl_zy_position2023";
            Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(sql, cnstr);
            DataTable dt = new DataTable();
            da.Fill(dt);
            long t1 = sw.ElapsedMilliseconds;
            foreach (DataRow dr in dt.Rows)
            {
                dr["mx"] = double.Parse(dr["mx"].ToString()) + 1;
                dr["my"] = double.Parse(dr["my"].ToString()) + 1;
            }

            Npgsql.NpgsqlCommandBuilder b = new Npgsql.NpgsqlCommandBuilder(da);
            //da.UpdateBatchSize = 0;
            this.textBox1.Text = da.UpdateBatchSize.ToString() + "/" + dt.Rows.Count;
            da.Update(dt);
            long t2 = sw.ElapsedMilliseconds;

            this.textBox2.Text = t1 + "/" + t2;