加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 读取数百万条数据记录的最佳表现

发布时间:2020-12-15 21:57:17 所属栏目:百科 来源:网络整理
导读:我有一个包含大量数据(数百万行)的数据库,并且在白天用大量数据进行更新,我还备份了这个数据库用于报告,因此获取数据报告不会影响到主数据库的性能. 为了将数据库与主数据库同步备份,我编写了一个查询主数据库并将新数据插入备份数据库的Windows服务…每次查
我有一个包含大量数据(数百万行)的数据库,并且在白天用大量数据进行更新,我还备份了这个数据库用于报告,因此获取数据报告不会影响到主数据库的性能.

为了将数据库与主数据库同步备份,我编写了一个查询主数据库并将新数据插入备份数据库的Windows服务…每次查询从主数据库获取5000行时…

编辑:

查询如下:

const string cmdStr = "SELECT * FROM [RLCConvertor].[dbo].[RLCDiffHeader] WHERE ID >= @Start and ID <= @End";

这是代码:

using (var conn = new SqlConnection(_connectionString))
{
            conn.Open();
            var cmd = new SqlCommand(cmdStr,conn);               
            cmd.Parameters.AddWithValue("@Start",start);
            cmd.Parameters.AddWithValue("@End",end);

            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

            while (reader.Read())
            {
                var rldDiffId = Convert.ToInt32(reader["ID"].ToString());
                var rlcDifHeader = new RLCDiffHeader
                {
                    Tech_head_Type = long.Parse(reader["Tech_head_Type"].ToString()),ItemCode = long.Parse(reader["ItemCode"].ToString()),SessionNumber = long.Parse(reader["SessionNumber"].ToString()),MarketFeedCode = reader["MarketFeedCode"].ToString(),MarketPlaceCode = reader["MarketPlaceCode"].ToString(),FinancialMarketCode = reader["FinancialMarketCode"].ToString(),CIDGrc = reader["CIDGrc"].ToString(),InstrumentID = reader["InstrumentID"].ToString(),CValMNE = reader["CValMNE"].ToString(),DEven = reader["DEven"].ToString(),HEven = reader["HEven"].ToString(),MessageCodeType = reader["MessageCodeType"].ToString(),SEQbyINSTandType = reader["SEQbyINSTandType"].ToString()                                            
                };
                newRLCDiffHeaders.Add(rldDiffId,rlcDifHeader);
            }
            conn.Close();
        }

但是当我启动服务时…主数据库的性能变得更糟……代码效率不高?有没有更好的方法?因为我搜索并发现dataReader对于这种情况是最好的…或者我应该使用DataTable和SqlDataAdapter?

解决方法

您无法将此视为问题的正确答案或解决方案.
由于评论很大,我正在为您提供解决方案.

您可以尝试使用Ad hoc查询的概念吗?

使用此方法,您可以使用以下方法查询另一个数据库

SELECT a.*
FROM OPENROWSET('SQLNCLI','Server=Seattle1;Trusted_Connection=yes;','SELECT GroupName,Name,DepartmentID
      FROM AdventureWorks2012.HumanResources.Department
      ORDER BY GroupName,Name') AS a;

阅读更多
http://technet.microsoft.com/en-us/library/ms187569.aspx
http://technet.microsoft.com/en-us/library/ms190312.aspx

由于您正在使用服务,因此服务帐户肯定有权读取主数据库并插入以报告数据库.我建议你在报告数据库中有一个SP,它可以使用OpenRowSet访问主数据库并插入它.

查询将类似于此.

Insert into tbl
SELECT a.*
    FROM OPENROWSET('SQLNCLI',DepartmentID
          FROM AdventureWorks2012.HumanResources.Department
          ORDER BY GroupName,Name') AS a;

构成服务,您需要调用SP.我们有一个类似的问题,这是由openrowset完成的,我不知道它可以提供多少性能影响.但我建议你做一个POC,然后分析一下.请再次将此视为建议.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读