C# 如何以最快的方式处理具有400K数据的foreach/group by?
我有一个日志表,其中记录了每个用户的登录。 目前,我们在这里的排数接近500K 现在我想对这些数据进行统计,我们保存的是浏览器字符串:C# 如何以最快的方式处理具有400K数据的foreach/group by?,c#,sql,C#,Sql,我有一个日志表,其中记录了每个用户的登录。 目前,我们在这里的排数接近500K 现在我想对这些数据进行统计,我们保存的是浏览器字符串: “Mozilla/5.0(Windows NT 6.1;WOW64;rv:39.0)Gecko/20100101 Firefox/39.0” 我想要得到的是两个信息: 1) 浏览器和此浏览器的计数 2) 操作系统和此操作系统的计数 在我看来,我在这里有太多的选择: 1) 生成SQL语句以通过类似的方式通过组获取此数据 比如: SELECT CASE
“Mozilla/5.0(Windows NT 6.1;WOW64;rv:39.0)Gecko/20100101 Firefox/39.0” 我想要得到的是两个信息:
1) 浏览器和此浏览器的计数
2) 操作系统和此操作系统的计数 在我看来,我在这里有太多的选择:
1) 生成SQL语句以通过类似的方式通过组获取此数据
比如:
SELECT CASE
WHEN [F_BROWSER] like '%Linux%' then 'Linux'
WHEN [F_BROWSER] like '%WINDOWS NT 4.0%' then 'WINDOWS NT 4.0'
WHEN [F_BROWSER] like '%WINDOWS NT 5.0%' then 'WINDOWS NT 5.0'
WHEN [F_BROWSER] like '%WINDOWS NT 5.1%' then 'WINDOWS NT 5.1'
WHEN [F_BROWSER] like '%WINDOWS NT 6.0%' then 'WINDOWS NT 6.0'
WHEN [F_BROWSER] like '%WINDOWS NT 6.1%' then 'WINDOWS NT 6.1'
End as OS
FROM [D_USER].[dbo].[T_LOGIN]
问题是:即使只有这6个测试值,查询时间也在20秒左右。我每天都会有更多的数据,比这6个案例多得多
2) 加载所有浏览器数据并在C#中对其进行访问
我还没有测试过这个
知道最快的解决方案是什么吗?也许比我这里的两个选项更好?让RDBMS(SQL Server?)在这里完成繁重的工作。这种方法的一个主要好处是,您不必有更多的数据从RDBMS传输到应用程序。保持数据传输范围窄(即在数据库端聚合数据)
另一个问题是您的实际数据
F_BROWSER
在操作系统上不是一个很好的聚合候选,因为该列中有更多的数据,导致您进行字符串匹配。如果可以的话,应该为操作系统、浏览器等设置单独的字段。这样,聚合(使用查询)和RDBMS都会更容易。在进入数据库的过程中解析浏览器/操作系统信息,这样您就不需要在退出时对其进行按摩。看起来您将来将继续使用此统计信息。你不能一枪吞下一大块。我会编写一个后台作业(控制台应用程序、sql作业等等),然后遍历整个表,解析表中所需的信息,并将其放入索引良好的列中
在
F\u浏览器上的索引
?为什么不保持值的运行总数,而不是每次要查看数据时都进行查询。是否可以更改此表?您必须向我们显示实际查询,以便我们帮助您。您当前的代码段甚至没有group by子句。我不知道它是否会加快速度,但您可以尝试先通过F\u BROWSER
对数据进行分组,然后将您的case语句应用于分组的数据