Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以最快的方式处理具有400K数据的foreach/group by?_C#_Sql - Fatal编程技术网

C# 如何以最快的方式处理具有400K数据的foreach/group by?

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

我有一个日志表,其中记录了每个用户的登录。 目前,我们在这里的排数接近500K

现在我想对这些数据进行统计,我们保存的是浏览器字符串:
“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作业等等),然后遍历整个表,解析表中所需的信息,并将其放入索引良好的列中

  • 在表中再添加两列并为它们编制索引:浏览器、操作系统
  • 您的列最好具有整数值,并为不同的浏览器类型和操作系统创建单独的表。因此,不同的浏览器将指示不同的int值
  • 在计划任务的第一次运行时,按批(每个循环1K)检查项目,并将值解析到新添加的列中
  • 下次运行计划作业时,只分析在这两列中具有null值的行。所以你会保持更新
  • 您可以更快地运行聚合函数,因为您的列被编入索引并进行了很好的分隔

  • F\u浏览器上的
    索引
    ?为什么不保持值的运行总数,而不是每次要查看数据时都进行查询。是否可以更改此表?您必须向我们显示实际查询,以便我们帮助您。您当前的代码段甚至没有group by子句。我不知道它是否会加快速度,但您可以尝试先通过
    F\u BROWSER
    对数据进行分组,然后将您的case语句应用于分组的数据