【问题标题】:Sql request in a loop slow down c# app循环中的 Sql 请求减慢 C# 应用程序
【发布时间】:2017-05-16 12:15:12
【问题描述】:

我的应用程序用于自动恢复数据库。

我创建了一个获取还原完成百分比的函数。

问题是它执行得越多,它就越慢。我的电脑性能变得非常糟糕,一切都很慢。

我认为请求中有问题。

private void GetPercentRestore(string dbName, string query)
    {
            // T-SQL command to have information on the backup
            query = query.Replace("'", "''");
            string cmd =
                $"SELECT sysdb.NAME AS [Name], dmv.PERCENT_COMPLETE AS [PercentComplete] FROM sys.databases sysdb INNER JOIN sys.dm_exec_requests dmv ON sysdb.database_id = dmv.database_id CROSS APPLY sys.dm_exec_sql_text(dmv.SQL_HANDLE) dest WHERE TEXT LIKE '{query}';";
            int percent = 0;
            int lastPercent = -1;

            // Initialize the new connection : need because two query at the same time
            SqlConnection conn =
                new SqlConnection(
                    System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionCluster"].ToString());
            SqlCommand command = new SqlCommand(cmd, conn);
            command.CommandTimeout = 3600;


            try
            {

                while (percent < 100)
                {
                    conn.Open();
                    // Execute the command
                    var result = command.ExecuteReader();

                    // Count the total of the size of the backup
                    if (result.HasRows)
                    {
                        result.Read();
                        //ProgressBarViewModel e = new ProgressBarViewModel();
                        percent = Convert.ToInt32(result["PercentComplete"]);
                    }
                    else // if not result, assume that Restore is complete
                        percent = 100;


                    if (percent != 100)
                        Thread.Sleep(10000);

                    result.Close();
                    conn.Close();
            }

            }
            catch (Exception e)
            {
                LogFile.WriteError(e.Message);
            }
        conn.Close();
    }

【问题讨论】:

  • 所以您正在执行还原并尝试同时从数据库查询?这可能是普遍的问题。否则我建议在Sleep 之前关闭连接,看看是否有帮助。也许也可以将连接和命令放在using 语句中。
  • juharr 是对的。遍历所有 ADO.NET 对象,如果它实现了 IDispose,请在它们周围放置 using 块。

标签: c# mysql sql .net database


【解决方案1】:

当然,这段代码很慢。您正在为 while 循环的每个循环周期执行以下操作-

  1. 打开 SQL 连接。 (这需要时间,具体取决于您的网络速度)

  2. 执行包含 INNER JOIN、CROSS APPLY 和 WHERE 子句的查询。

您的第一个选项将是在循环之外打开连接。 这将立即提高一些性能。

第二个选项 将删除此内联查询并在您的数据库 中编写一个存储过程,然后调用该存储过程。

如果您在执行此操作时遇到任何问题,请告诉我。

【讨论】:

  • 在循环外打开连接大大提高了性能,我每分钟而不是每十秒执行一次查询。
  • 很高兴我能帮助@ParkPark
猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多