C# 读取百万条数据记录的最佳性能

C# 读取百万条数据记录的最佳性能,c#,sql,dataset,sqldatareader,sqldataadapter,C#,Sql,Dataset,Sqldatareader,Sqldataadapter,我有一个包含大量数据(数百万行)的数据库,并且白天也在更新大量数据,我有一个用于报告的数据库备份,因此获取数据报告不会影响主数据库的性能 为了将备份数据库与主数据库同步,我编写了一个windows服务,它查询主数据库并将新数据插入备份数据库。。。每次查询从主数据库获取5000行时 编辑: 查询如下: const string cmdStr = "SELECT * FROM [RLCConvertor].[dbo].[RLCDiffHeader] WHERE ID >= @Start and

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

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

编辑: 查询如下:

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

但是当我开始服务的时候。。。主数据库的性能变差了。。。代码是否无效?还有更好的办法吗?因为我搜索并发现
dataReader
最适合这种情况。。。或者我应该使用
DataTable
SqlDataAdapter

您不能将此视为您问题的正确答案或解决方案。 由于评论太多,我给你提供了一个解决方案

您可以尝试使用
临时查询的概念吗

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

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
访问主数据库并插入其中

查询将类似于此

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,然后分析它。
请再次考虑这是一个建议。 不,使用
SqlDataAdapter
绝对不是一种更有效的方法。我推荐的一件事是——试试小一点的。。。5000行可能导致SQL Server执行锁升级并锁定整个表,而不是使用行级锁。使用2000行或类似的行。此外,您是否已经查看了哪些行可以为您完成所有这些操作?它就在产品中,针对最高性能进行了调整……对于数据库性能,发送到db的查询比使用DataTable或DataReader更重要。您可以使用nolock关键字读取未受限制的数据。对我来说,这个问题最有趣的部分是
cmdStr
的内容-如果没有这些内容,我们所拥有的只是“我有一些从数据读取器读取的代码”-这本身是很好的,并且不是低效的。但是:您运行的是什么命令?您多久运行一次?我的假设是,这里的任何性能损失都与在DB服务器上花费的时间有关——但您应该对其进行分析以找出原因——没有任何东西表明.NET性能有问题issue@Paridokht
ID
上是否有聚集索引?重新设置
nolock
-即:
使用(nolock)从[RLCConvertor].[dbo].[RLCDiffHeader]中选择*,其中ID>=@Start和ID感谢您的建议,我会尝试:)但我有一个特定的保存方法,我必须使用它将新数据保存到报表数据库中..我不能使用
SP
插入新数据..因为它不支持
OOP
编程,我想.什么是OOP编程?你是说面向对象编程?请显示保存方法。我认为你在使用EF?我真的不清楚你为什么在这里提倡
OPENROWSET
——这里似乎没有令人信服的论据。@VeeKayBee,我没有使用
EF
,正如您可以看到的
SqlDataReader
Sqlcommand
等…我认为可能是save方法并不重要,因为save方法与另一个数据库(report db)有连接…瓶颈是当我想从主数据库读取数据时。
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;