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

本文关键字:400K 数据 foreach group 处理 方式 | 更新日期: 2023-09-27 18:05:18

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

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

我想要得到的是2个信息:
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#中查找它们。

我还没有测试过。

你知道最快的解决方案是什么吗?
也许有比我的两个选择更好的主意?

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

看起来您将在将来继续使用此统计信息。你不可能一次吞下一大块。我会写一个后台作业(控制台应用程序,sql作业什么的),并将通过整个表和解析所需的信息从你的表,并把它纳入良好的索引列。

  1. 添加额外的2列到你的表和索引他们:浏览器,操作系统
  2. 最好您的列应该具有整数值,并为不同的浏览器类型和操作系统创建单独的表。所以不同的浏览器会指示不同的int值。
  3. 第一次运行计划任务时,按批处理(每个循环1K)遍历项,并将值解析到新添加的列中。
  4. 下次调度作业运行时,只解析这两列中具有空值的行。所以你会保持更新。
  5. 你可以更快地运行你的聚合函数,因为你的列被索引和很好地分离。

让RDBMS (SQL Server?)来完成这里繁重的工作。这种方法的主要优点之一是,您不必有更多的数据从RDBMS 传输到应用程序。保持数据传输范围窄(即在数据库端聚合数据)。

另一个问题是你的实际数据。F_BROWSER不是操作系统上聚合的理想候选者,因为该列中有更多的数据,导致您需要进行字符串匹配。如果可以,应该为操作系统、浏览器等设置单独的字段。这样,聚合对您(使用查询)和RDBMS都更容易。解析中的到数据库的途中的浏览器/操作系统信息,这样您就不需要在输出时对其进行处理。