怎样才能使这个功能更有效率。它现在以6-45秒的速度运行。我已经运行了这个特定方法的dotTrace分析器,它的总时间在6,000到45,000 is之间。大部分时间用于"MoveNext“和"GetEnumerator”调用。
时代的例子是
71.55% CreateTableFromReportDataColumns - 18, 533* ms - 190 calls
-- 55.71% MoveNext - 14,422ms - 10,775 calls 我能加快速度吗?它经常被调用,而秒加起来:
private static DataTable CreateTableFromReportDataColumns(Report report)
{
DataTable table = new DataTable();
HashSet<String> colsToAdd = new HashSet<String> { "DataStream" };
foreach (ReportData reportData in report.ReportDatas)
{
IEnumerable<string> cols = reportData.ReportDataColumns.Where(c => !String.IsNullOrEmpty(c.Name)).Select(x => x.Name).Distinct();
foreach (var s in cols)
{
if (!String.IsNullOrEmpty(s))
colsToAdd.Add(s);
}
}
foreach (string col in colsToAdd)
{
table.Columns.Add(col);
}
return table;
}如果您需要这里的sql表定义,它们是:
ReportData
ReportID intReportDataColumn
ReportDataColumnId int
ReportDataId int
Name varchar(255)
Value text 发布于 2010-06-03 19:01:24
我相信你应该能够把你的函数简化成这样的东西
var columnsToAdd = report.ReportDatas
.SelectMany(r => r.ReportDataColumns)
.Select(rdc => rdc.Name)
.Distinct()
.Where(name => !string.IsNullOrEmpty(name));然后把名字加到你的桌子上。
发布于 2010-06-03 19:02:14
您的代码(仅)运行foreach循环,因此,该方法将大部分时间用于MoveNext()等方面的结论并不令人惊讶。
您正在对isnullOrEmpty和Distinct进行双重工作(由HashSet重复)。
我的版本是:
private static DataTable CreateTableFromReportDataColumns(Report report)
{
DataTable table = new DataTable();
HashSet<String> colsToAdd = new HashSet<String> { "DataStream" };
foreach (ReportData reportData in report.ReportDatas)
{
foreach (var column in reportData.ReportDataColumns)
{
if (!String.IsNullOrEmpty(column.Name))
colsToAdd.Add(column.Name);
}
}
foreach (string col in colsToAdd)
{
table.Columns.Add(col);
}
return table;
}但我不认为会有很大的进步
发布于 2010-06-04 02:37:18
当你问这个问题时,你应该提到LinqToSql,然后你会得到一些回复来查看你的数据库,看看它是一个长时间运行的查询,还是重复的查询
private static DataTable CreateTableFromReportDataColumns(Report report)
{
DataTable table = new DataTable();
table.Columns.Add("DataStream");
IEnumerable<string> moreColumns = report.ReportDatas
.SelectMany(z => z.ReportDataColumns)
.Select(x => x.Name)
.Where(s => s != null && s != "")
.Distinct();
foreach (string col in moreColumns)
{
table.Columns.Add(col);
}
return table;
} 另外,捕获使用sql分析器发出的查询。然后,通过使用前面的语句来分析查询的IO和时间。
SET STATISTICS TIME ON
SET STATISTICS IO ON
--your query here最后,您可能需要一个或两个索引来降低IO。列顺序在这里很重要。
CREATE INDEX IX1_ReportData ON ReportData(ReportID, Id)
CREATE INDEX IX1_ReportDataColumn ON ReportDataColumn(ReportDataId, Name)https://stackoverflow.com/questions/2968857
复制相似问题