如何使用400K数据以最快的方式处理foreach / group?

时间:2015-07-29 15:43:17

标签: c# sql

我有一个记录每个用户登录的日志表。 目前我们的行数接近500K。

现在我想对这些数据进行统计,我们保存的是浏览器字符串:
“Mozilla / 5.0(Windows NT 6.1; WOW64; rv:39.0)Gecko / 20100101 Firefox / 39.0”

我想得到的是2个信息:
1)浏览器和此浏览器的计数
2)OS和OS的计数

据我所知,我在这里也有选择:
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#中预先处理。

我还没有测试过。

知道什么是最快的解决方案?
也许是一个更好的主意,然后我的两个选择呢?

2 个答案:

答案 0 :(得分:2)

您将来会继续使用此统计信息。你不能一次吞下一大块。我会编写一个后台作业(控制台应用程序,sql作业),并将遍历整个表并从表中解析所需信息并将其放入索引良好的列中。

  1. 在表格中再添加2个额外列并将其编入索引:浏览器,操作系统
  2. 最好您的列应具有整数值,并为不同的浏览器类型和操作系统创建单独的表。因此,不同的浏览器将指示不同的int值。
  3. 首次运行计划任务时,按批次检查项目(每个循环1K)并将值解析为新添加的列。
  4. 下次运行预定作业时,仅解析在这两列中具有空值的行。所以你会保持更新。
  5. 您可以更快地运行聚合函数,因为您的列已编制索引并且分离良好。

答案 1 :(得分:1)

让RDBMS(SQL Server?)在这里做繁重的工作。这种方法的主要好处之一是,您不必有更多的数据从 RDBMS 传输到应用程序。保持数据传输的狭窄(即汇总数据库端的数据)。

另一个问题是您的实际数据。 F_BROWSER不适合在操作系统上进行聚合,因为该列中包含更多数据,导致您进行字符串匹配。如果可以,您应该有OS,浏览器等的单独字段。这样,聚合将更容易(使用查询)以及RDBMS。将 中的浏览器/操作系统信息解析到数据库中,这样您就不需要在出路时按摩它。