读取百万条数据记录的最佳性能
本文关键字:记录 数据 最佳 性能 百万 读取 | 更新日期: 2023-09-27 18:36:18
我有一个包含大量数据(数百万行)的数据库,并且在白天也使用大量数据进行更新,我备份了此数据库以进行报告,因此获取数据报告不会影响主数据库的性能。
为了将备份数据库与主数据库同步,我编写了一个 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.aspxhttp://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并分析它。请再次将此视为建议。