【问题标题】:How to manage a million records?如何管理一百万条记录?
【发布时间】:2012-04-19 19:30:23
【问题描述】:

我真的需要专家的帮助来回答我的问题。

这是场景:

我正在使用 sql 选择查询来检索一百万条记录。 我需要对存储在数据表中的结果记录进行排序和分组(一次执行) 并循环遍历它以对其进行分组和排序。 我知道这太幼稚了,不是处理它的正确方法。 如何有效管理百万条记录并对其应用分组和排序?

这里真的需要帮助。听说过批量执行选择查询,但是在我们手头没有全部数据的情况下如何实现分组和排序? 我不能直接使用 sql order by 和 group by,这不符合我的要求。

这是我现在正在做的事情:

我有以下对象,即用于分组和排序的列名

List<Group> groupList;
List<Sort> sortList;
DataTable reportData; // Here im having the entire records from db

我逐行遍历“reportData”,并匹配当前行和上一行以进行自定义分组和排序。想知道当我们使用批量执行或有任何替代解决方案时如何做到这一点?

【问题讨论】:

  • 您可以使用 linq to sql 函数在本地分组:OrderByGroupBy
  • 如果您不能进行 sql 分组/排序,那么您将不得不在客户端进行,这意味着您必须将整个结果集放入客户端应用程序中。希望你有足够的内存来保存一百万条这样的记录。
  • 此外,在应用程序中一次获取数百万条记录并不是一个好习惯;更好的是您使用 SQL Server 端的存储过程对其进行操作,然后获取记录。
  • 也许您可以提供一些代码或伪代码中的最小示例。
  • 在 SQL Server 端使用视图、函数或存储过程仅获取您需要的数据。您需要发布不同的问题以获得处理百万行的答案。

标签: c# mysql sql-server sql-server-2008


【解决方案1】:

听起来你应该实现Partition Pruning。分区将允许分离您请求的内容,以便更快地查询。

【讨论】:

  • 拥有数百万条记录?你一定是在开玩笑。分区很棒,但只有当你有数据时它们才很棒。数百万几乎不是 sql server 甚至意识到的。数十亿 - 好的。数百万 - 没有什么可变得聪明的。
  • @TomTom :分区仍然有助于缩短查询时间,对吧?你只是说改进会很小而且可能不值得,对吧?但这完全是主观的,100 毫秒的改进对于许多应用程序来说是很小的,但对于实时系统来说却意味着很多。
【解决方案2】:

例如:

1.假设您想按 DocumentTypeID 对它们进行分组

var groupByType = reportData.GroupBy(g=>g.DocumentTypeID); 

2。按字母顺序排序

 var sortAlphabetically = reportData.OrderBy(g=>g.DocumentName);

3.分组和排序

var groupAndSort = reportData.GroupBy(g=>g.DocumentTypeID)
                             .OrderBy(g=>g.DocumentName);

4.排序和分组

var groupAndSort = reportData.OrderBy(g=>g.DocumentName)
                             .GroupBy(g=>g.DocumentTypeID);

5.多重分组和排序

var multipleGroupAndSort = reportData.GroupBy(g=>g.DocumentTypeID)
                                     .GroupBy(g=>g.CreatedOnDate.Month)
                                     .OrderBy(g=>g.DocumentName);

以此类推……

但我仍然不鼓励将数百万行带入应用程序。会消耗内存。当然有办法通过存储过程等来管理它。

【讨论】:

  • 我将有多个级别的分组和排序。我将根据类型进行分组,比如 DocumentType 并根据 DocumentName 进行排序,在它本身内,我将根据 DocumentCreatedonMonth 进行分组并根据 Date 进行排序。使用 lamda 表达式将如何完成?
  • 感谢 Marshal 的指导。需要尝试人们给出的所有建议。我想知道使用数据表或列表来保存例如 10k 条记录是否好?
  • @NewBie:列表存储单列,数据表有多列。选择将基于您想要的列数。
  • 如果我可以动态创建结果对象并将其保存为列表 会怎样?那会有什么不同吗?
  • 如果您不知道返回类型,请使用var 存储结果。
【解决方案3】:

如果我理解正确,在你的情况下,我会创建一个临时数据库表,其中包含我想要特别涵盖我的分组的结构。

然后我会从主表中选择记录并将它们插入到临时表中,应用所有修改,包括分组。

还应应用关于您希望它们如何排序的特定索引。

之后,从这个表中选择,做你该做的,最后如果数据不再需要,删除临时表。

我会选择上述解决方案,因为内存中的一百万条记录对我来说很麻烦......

【讨论】:

  • 这根本不可能。因为我连接到我没有写权限的数据库。只能对其触发选择查询。
  • 好的,那么记忆是你唯一的机会。祝你好运。
【解决方案4】:

我需要对结果记录进行排序和分组 我存储在数据表中(在一次执行中)并循环遍历它 用于对其进行分组和排序。

为了什么?

说真的。

不要拉然后尝试在后面加上一个愚蠢的对象模型聪明(而且数据集不是特别聪明,抱歉)。

在您的选择语句中进行分组和排序,提取已经分组和连接的数据并完成。

17年前原始版本发布时(4.2是sysase sql server的一个端口),一百万条记录是sql server的少量数据。这些天来,它很可能适合处理器的第三级缓存,而不是一个合适的 sql server 甚至意识到它刚刚处理过。

SQL 是特别好的广告项目,自从它们引入 MARS 以来,您甚至可以在一个连接上运行多个查询,这在这里派上用场。

所以,返回 - 丢弃数据集和“我尝试编写排序算法”并创建适当的 SQL 语句以根据需要提取数据。

【讨论】:

  • 但情况是,在我的应用程序中,用户需要显示一些字段并根据另一个字段进行排序。我猜这不能使用 sql 来完成。那我该怎么做呢?
  • 可以的。没有人说 SQL 必须是硬编码的。作为程序员,您必须完成您的工作——根据用户输入的需求动态组合 SQL(最好是 LINQ 语句的形式)。你知道,自从 SQL 创建以来,有能力的程序员就已经这样做了。这很有可能比你的寿命更长(SQL 实际上很古老)。没有人说不能根据查询表单动态构造 SQL 语句。
  • 这里需要进行拼写检查
猜你喜欢
  • 2016-03-06
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2019-09-16
相关资源
最近更新 更多