【问题标题】:DataSet Relations or linq searching for better performance?数据集关系或 linq 寻找更好的性能?
【发布时间】:2010-11-21 17:50:12
【问题描述】:

我们有两个表:
Parent
ID: Integer //主键
名称:字符串

儿童
FK: Integer //对 Parent.ID 的引用
更多信息:字符串

Parent 有 100,000 行,Child 有 10,000 行(parent 中的很多行在 child 中没有使用)

目前我们这样做:

MyDS.Relations.Add("PC", MyDS.Tables["Parent"].Columns["ID"],
                         MyDS.Tables["Child"].Columns["FK"]);
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
  DataRow drParent = drChild.GetParentRows(MyDS.Relations["PC"]).FirstOrDefault();

我们正在考虑改为仅使用 Linq 手动搜索:

foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
  DataRow drParent = MyDS.Tables["Parent"].AsEnumerable().FirstOrDefault(
                                   drParent => drParent["ID"] == drChild["FK"]);

表 Child 仅迭代一次,然后处理数据集。任何人都有使用一种方法或另一种方法的经验 - 如果只使用一次,在方法 1 中创建关系会浪费时间吗?

【问题讨论】:

    标签: c# linq dataset


    【解决方案1】:

    建立关系绝对不是浪费时间。

    在评估问题的两个潜在解决方案时,您应该始终比较每个选项的成本/时间。从那里您通常可以决定哪个选择更好。要记住的一件事是 DataRelation 的存在是为了优化这些类型的查找。

    如果将 DataRelation 添加到现有表中,添加关系大约需要 125 毫秒(创建所需的哈希以通过 Datakeys 映射父/子行)。

    使用 DataRelation 为 10,000 个子行中的每一行查找每个父行只需要 70 毫秒,而仅使用上面记录的 Linq 方法需要 4 分钟以上。

    当您考虑它时,这是有道理的,因为第一个将遍历 10,000 个子行并使用 DataRelation 的映射 Datakeys 来查找父行(不需要遍历所有 100,000 个父行)。但是,第二种解决方案必须遍历每个子行 (10,000) 并搜索 100,000 个父行以找到合适的匹配项 (10,000 x 100,000 = 1,000,000,000)。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多