我有一个Sql SP需要大约1分钟才能运行,返回25,000行数据。 (可以返回多个数据集)。
目前尝试将其转换为XElement / XDocument以生成多个报告会导致c#方法转换此时间超过30分钟,这需要30分钟的Sql Connection \ Command Timeout,这太长了。 / p>
任何人都可以帮助排查/找到我可以对以下转换代码进行改进的地方,因为在这里某处必须存在巨大的低效率。
电话
public void xyzCall()
{
....
XElement result = SqlDataReadertoXML(sqlcommand.ExecuteReader());
....
}
转换功能
private XElement SqlDataReadertoXML(SqlDataReader datareader)
{
XElement results = new XElement("ResultSets");
// Read Next RecordSet
do
{
XElement result = new XElement("ResultSet");
//Read Next Row in this RecordSet
while (datareader.Read())
{
XElement datanode = new XElement("Item");
// Read Each Column in this RecordSet
for (int i = 0; i < datareader.FieldCount; i++)
{
// Node.Attr("Name") = Column Name, Node.Value = Field
if (datareader.GetName(i) != "") datanode.Add(new XElement(datareader.GetName(i), datareader[i].ToString()));
}
result.Add(datanode);
}
results.Add(new XElement(result));
} while (datareader.NextResult());
datareader.Close();
return results;
}
答案 0 :(得分:4)
如果您有权访问数据库,我建议您修改SP或编写新的SP以返回首选XML格式的数据,这将更快。在内存中构建XML对于大型数据集来说不是一个好主意。
答案 1 :(得分:0)
我没有看到任何明显的问题,但我毫不奇怪在内存中将250K行转换为xml会烧毁你的CPU。
您可以做的一件事是// ize过程(例如,每个resultSet一个线程)
我会使用SQL Server的for xml
子句代替!