c# - 读取百万记录数据的最佳性能

标签 c# sql dataset sqldatareader sqldataadapter

我有一个包含大量数据(数百万行)的数据库,并且白天也在更新大量数据,我有这个数据库的备份用于报告,所以获取数据报告不会影响主数据库的性能。

为了将备份数据库与主数据库同步,我编写了一个 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 最适合这种情况……还是应该使用 DataTableSqlDataAdapter

最佳答案

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

你能尝试使用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', 'Server=Seattle1;Trusted_Connection=yes;',
         'SELECT GroupName, Name, DepartmentID
          FROM AdventureWorks2012.HumanResources.Department
          ORDER BY GroupName, Name') AS a;

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

关于c# - 读取百万记录数据的最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19510921/

相关文章:

c# - WPF 网页浏览器 HTMLDocument

mysql - sql建表不起作用

使用 LINQ 删除 C# 数据集列

c# - 如何解决泛型方法中类型推断的局限性

c# - Linq 查询数组中的每个元素

c# - VS 在 C# 代码中获取返回值?

mysql - 如何更新MySql列

mysql - 通过不返回我所期望的来多次加入 order by 和 group

delphi - Delphi-如何检查数据集是否已获取所有行?

java - Spark根据时间戳中的时间间隔将列添加到数据集