【问题标题】:Which one is faster? Sort data in IQueryable or IEnumerable?哪个更快?在 IQueryable 或 IEnumerable 中对数据进行排序?
【发布时间】:2016-01-28 03:45:51
【问题描述】:

我有一个超过 6 亿行的表。我有一个查询(如营业额报告查询),它选择表的部分(由RegDate 条件过滤的所有数据的最大 5%)。我想对这个查询的结果进行排序。

我在 IdRegDate 列上使用索引。哪个更快?对IQueryableIEnumerable中的数据进行排序?

var activites = _turnOverRepository.GetTransactions(account.Id)
                .Where(a => a.RegDate >= fromDate && a.RegDate <= toDate)
                .OrderBy(a => a.RegDate)
                .ThenBy(a => a.RegTime)
                .ToList();

var activites = _turnOverRepository.GetTransactions(account.Id)
                .Where(a => a.RegDate >= fromDate && a.RegDate <= toDate)
                .ToList();
                .OrderBy(a => a.RegDate)
                .ThenBy(a => a.RegTime)

【问题讨论】:

  • “我在 Id 和 RegDate 列上使用索引。” - 你能说得更具体点吗?
  • 5% 过滤器在哪里?
  • 为什么你不同时尝试并测量执行时间?还使用 sql profiler 检查正在对 db 执行的查询并运行 explain query
  • @AntonínLejsek 在此表中插入数据也很重要,因为如果我增加索引数,那么插入时间也会增加。
  • @JuanCarlosOropeza 数据按 RegDate 条件过滤

标签: c# sql sql-server performance linq


【解决方案1】:

如果您有正确的索引,使用 IQueryable 在数据库中排序是最快的。这是因为有一个关于排序的规则,最快的排序发生在已经排序的数据上。索引将在插入时对数据进行排序。

在 (Id, RegDate, RegTime) 上创建单个复合索引。

【讨论】:

  • 在 (Id, RegDate, RegTime) 上创建单个复合索引。我怀疑这是最好的列顺序
  • 怀疑?如果可能,您总是将最有选择性的列放在最前面,即 by id,它也支持 GetTransations(),然后下一列在 where 子句中,最后一列是支持“order by”。我不确定问题在哪里。
  • 你的意思是the index sort the data on insert ??没有多大意义,如果您在多个字段上有不同的索引怎么办?你不能为每个索引排序。
  • @MitchWheat 你想帮忙回答这个问题吗?
  • @JuanCarlosOropeza 每个非聚集索引将维护索引中列的列值的排序版本,并带有指向数据行的指针。不,它不会在技术上对每个索引的所有数据进行排序,除非您通过创建完整的覆盖索引来创建伪二级聚集索引,但它将维护确定排序的值的排序列表。这将使上面的查询在执行计划中没有排序,只是一个带有相应书签查找的索引范围扫描。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多