为什么这个交叉连接在Linq中这么慢?
本文关键字:交叉连接 为什么 Linq | 更新日期: 2023-09-27 18:03:36
我编写了这段Linq来处理CROSS Join,就像数据库在多个列表之间一样。
但由于某些原因,当任何列表超过3000时,它都非常慢。我会等30岁?这些列表可以包含非常大的数字。
这个查询与来自ColumnDataIndex的其他列表的数据的每个关系进行循环。
有什么建议吗?
UPDATE ** -将数据插入到预先从配置的源构建的正常列表中。
RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
from target_row in ColumnDataIndex[dest_key]
where GetColumnFromUID(source_row, rel.SourceColumn) == GetColumnFromUID(target_row, rel.TargetColumn)
select new Row()
{
Columns = MergeColumns(source_row.Columns, target_row.Columns)
}).ToList();
两个额外的函数:
mergeccolumns :从两个条目中获取Columns并将它们合并成一个数组。
public static Columnn[] MergeColumns(Column[] source_columns, Column[] target_columns)
{
Provider.Data.BucketColumn[] new_column = new Provider.Data.BucketColumn[source_columns.Length + target_columns.Length];
source_columns.CopyTo(new_column, 0);
target_columns.CopyTo(new_column, source_columns.Length);
return new_column;
}
GetColumnFromUID:返回Item中与给定的列uid匹配的列的值。
private static String GetColumnFromUID(Row row, String column_uid)
{
if (row != null)
{
var dest_col = row.Columns.FirstOrDefault(col => col.ColumnUid == column_uid);
return dest_col == null ? "" + row.RowId : dest_col.Value.ToString().ToLower();
}
else return String.Empty;
}
更新:最终将数据和查询移动到数据库中。
实际上不需要执行交叉连接。交叉连接本质上是昂贵的操作。你不应该这样做,除非你真的需要它。在您的例子中,您真正需要的只是一个内连接。你正在执行交叉连接,这会产生很多你根本不需要的值,然后你会过滤掉这些值中的很大一部分,只留下你需要的几个值。如果从一开始就进行内部连接,那么只需要计算所需的值。这将节省您需要创建一大堆您不需要的行,只是让它们被丢弃。
LINQ有自己的内部连接操作Join
,所以你甚至不需要自己写:
RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
join target_row in ColumnDataIndex[dest_key]
on GetColumnFromUID(source_row, rel.SourceColumn) equals
GetColumnFromUID(target_row, rel.TargetColumn)
select new Row()
{
Columns = MergeColumns(source_row.Columns, target_row.Columns)
}).ToList();
您不是在进行交叉连接,而是使用ON子句进行内部连接,仅在您的情况下,使用where谓词中的ON子句。
内部连接通常使用两个哈希集/表完成,因此您可以根据行y中的值快速找到集合X中的行。
所以'weston的答案是OK的,但是你需要使用字典/哈希表来使它非常快。注意,每个键可能有更多行。你可以使用像这样的多值哈希表/字典:https://github.com/SolutionsDesign/Algorithmia/blob/master/SD.Tools.Algorithmia/GeneralDataStructures/MultiValueDictionary.cs