我有一个记录每个用户登录的日志表。 目前我们的行数接近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#中预先处理。
我还没有测试过。
知道什么是最快的解决方案?
也许是一个更好的主意,然后我的两个选择呢?
答案 0 :(得分:2)
您将来会继续使用此统计信息。你不能一次吞下一大块。我会编写一个后台作业(控制台应用程序,sql作业),并将遍历整个表并从表中解析所需信息并将其放入索引良好的列中。
答案 1 :(得分:1)
让RDBMS(SQL Server?)在这里做繁重的工作。这种方法的主要好处之一是,您不必有更多的数据从 RDBMS 传输到应用程序。保持数据传输的狭窄(即汇总数据库端的数据)。
另一个问题是您的实际数据。 F_BROWSER
不适合在操作系统上进行聚合,因为该列中包含更多数据,导致您进行字符串匹配。如果可以,您应该有OS,浏览器等的单独字段。这样,聚合将更容易(使用查询)以及RDBMS。将 中的浏览器/操作系统信息解析到数据库中,这样您就不需要在出路时按摩它。