我真的需要专家帮助来回答我的问题。
以下是该方案:
我使用sql select查询来检索一百万条记录。 我需要对结果记录执行排序和分组,这些记录存储在数据表中(在一次执行中) 并循环通过它进行分组和排序。 我知道这是如此幼稚,而不是处理它的正确方法。 如何有效管理百万条记录并对其进行分组和排序?
真的需要帮助。听说批处理执行选择查询,但是如果我们手头没有整个数据,如何实现分组和排序? 我不能直接去sql order by和group by,这违背了我的要求。
我有以下对象,即用于分组和排序的列名
List<Group> groupList;
List<Sort> sortList;
DataTable reportData; // Here im having the entire records from db
我逐行循环遍历'reportData',并匹配自定义分组和排序的当前行和上一行。想知道当我们使用批处理执行或任何替代解决方案时,如何做同样的事情?
答案 0 :(得分:3)
我需要对结果记录执行排序和分组 即存储在数据表中(在一次执行中)并循环通过它 用于分组和排序。
为什么?
严重。
不要拉,然后尝试使用后面的愚蠢对象模型智能化(并且数据集不是特别聪明,抱歉)。
在select语句中进行分组和排序,拉出已经分组并加入的数据并完成它。
一百万条记录是sql server的一小部分数据,当原始版本发布时(4.2,它是sysase sql server的一个端口)17年前。这些天它可能很适合处理器的三层缓存,并且没有什么是正确的SQL服务器甚至意识到它刚刚处理过。
SQL是做项目的特别好的广告,自从他们引入MARS后,你甚至可以通过一个连接运行多个查询,这在这里很方便。
所以,回去 - 抛弃数据集和“我尝试编写排序算法”并创建适当的SQL语句以根据需要提取数据。
答案 1 :(得分:0)
听起来你应该实施Partition Pruning。分区将允许像您要求的那样分离内容,以便更快地进行查询。
答案 2 :(得分:0)
如果我理解正确,在你的情况下,我会创建一个临时数据库表,其中包含我想要的结构,特别是我的分组。
然后我会从主表中选择记录并将它们插入到临时表中,包括所有修改,包括分组。
还应该应用关于如何排序的特定索引。
之后,只需从此表中选择,执行您必须执行的操作,最后如果不再需要数据,请删除临时表。
我会选择上面的解决方案,因为内存中有数百万条记录给我带来麻烦......
答案 3 :(得分:-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);
等等......
但我仍然不鼓励将数百万行用于应用程序。它将耗费内存。当然有办法通过存储过程等来管理它。