减少数据库中远程选择的CPU负载

SK2*_*017 7 c# cpu odbc cpu-usage

我从一个自定义生产数据库远程选择结果,其标准大约是C#应用程序的三分钟.

每次执行select命令时,我使用CPU的服务器PC都会上升到50%左右.但当然,负载应该在我连接的数据库上?

在检索数据进行读取之前,为什么C#应用程序会升级到50%?

一些背景

  • 我从调试中得出结论,远程数据库上的Select语句大约需要30-40秒,请记住我选择的是使用索引列的条件.
  • 在从远程数据库中选择数据的同时,我监控了TaskManager,并且CPU处于50%,直到选择为完成...这可以持续每个循环大约30-40秒.
  • 如果我在远程数据库的本机sql引擎中选择,则select上没有延迟,立即返回数据(如果有的话).
  • 我知道它不是解析结果集占用CPU负载,因为一些选择将不返回任何内容.

这是我正在使用的一些代码.

OdbcConnection remoteConn = new OdbcConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString());

            remoteConn.Open();

            OdbcCommand remoteCommand = new OdbcCommand();
            remoteCommand.Connection = remoteConn;

            using (remoteConn)
            {
                string localSql = "";
                string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00

                remoteCommand.CommandText = remoteSql;

                OdbcDataReader remoteReader;

                remoteReader = remoteCommand.ExecuteReader();

                while (remoteReader.Read())
                {


                    for (int i = 0; i < 68; i++)
                    {
                        localSql += ",'" + remoteReader[i].ToString() + "'";
                    }

                }

            }
Run Code Online (Sandbox Code Playgroud)

我对应用程序进行了性能和诊断测试,并得出了这个结果.

在此输入图像描述

如果有的话,我可以如何减少CPU负载甚至完全消除它.它完全不同寻常,我不知道如何去做.

谢谢

Ran*_*ndy 5

谢谢你的信息,丹.这是我的想法......

我相信你的应用程序消耗这么多CPU的主要原因是因为你使用的驱动程序.

由于您要连接到SQL Server数据库,因此应使用知道如何优化客户端和服务器之间数据传输的SQL Server驱动程序.

要使用相应的驱动程序,请确保您使用SqlConnection,SqlCommand等等.

这将允许SQL Server在您查询数据读取器时将结果流式传输到客户端.

其次,不要ExecuteReader()DbCommand对象上使用该方法.SQL Server驱动程序独有的众多精彩功能之一就是该ExecuteReaderAsync()方法.

由于此命令是IO绑定操作(不是计算绑定),因此不需要阻止调用线程.当结果返回时,它们将到达IO完成线程.

下面是代码示例,说明更改后代码的外观.

using (var remoteConn = new SqlConnection(ConfigurationManager.ConnectionStrings["remoteConnectionString"].ToString()))
{
    remoteConn.Open();
    using (var remoteCommand = new SqlCommand())
    {
        remoteCommand.Connection = remoteConn;
        string localSql = "";
        string remoteSql = "select * from tracking where last_update > 212316247440000000"; // Julian No = 2015-07-12 11:24:00

        remoteCommand.CommandText = remoteSql;
        var remoteReader = await remoteCommand.ExecuteReaderAsync();
        while (remoteReader.Read())
        {
            for (int i = 0; i < 68; i++)
            {
                localSql += ",'" + remoteReader[i].ToString() + "'";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)