3

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

这是场景:

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

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

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

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

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

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

4

4 回答 4

4

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

做什么的?

严重地。

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

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

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

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

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

于 2012-04-06T08:22:06.063 回答
0

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

于 2012-04-06T04:30:38.520 回答
0

如果我理解正确,在您的情况下,我将创建一个临时数据库表,该表具有我想要特别涵盖我的分组的结构。

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

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

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

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

于 2012-04-06T06:25:02.690 回答
-1

例如:

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);

等等等等...

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

于 2012-04-06T04:44:11.117 回答