循环中的SQL请求减缓了c#app

时间:2017-05-16 12:15:13

标签: c# mysql sql .net database

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

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

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

我认为在重新招架中存在问题。

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();
    }

1 个答案:

答案 0 :(得分:1)

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

  1. 打开SQL连接。 (这需要时间根据您的网络速度而定)

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

  3. 第一个选项将在循环外打开连接。 这将立即改善一些表现。

    第二个选项将删除此内联查询并在数据库中编写存储过程并改为调用该存储过程。

    如果您在执行此操作时遇到任何问题,请与我们联系。