代码之家  ›  专栏  ›  技术社区  ›  Yaakov Ellis NevilleDNZ

在SQL Server或.NET中执行数据分析?

  •  1
  • Yaakov Ellis NevilleDNZ  · 技术社区  · 15 年前

    我需要执行一些数据分析。平均来说,它会涉及到大约50k-150k行。从这些行中,我需要根据五个不同的条件提取sum(x)和count(x)的总和。有两种方法可以解决这个问题:

    1. 编写10个不同的查询,每个查询设计为使用sum()或count()从x列聚合数据。运行每一个并使用sqlcommand.executescalar()检索结果。
    2. 创建一个自定义对象,包含评估不同条件所需的所有不同参数。使用sqlcommand.executedataReader()运行一个查询,返回组成包含所有不同条件子集的超集所需的所有数据。将数据读取器中的每一行读取到新对象中,并将每一行添加到列表集合中。首先检索所有数据,使用Linq to对象根据不同的条件确定所需的不同sum()和count()值。

    我知道我可以尝试每一个,看看哪一个最快,但我对社区的建议感兴趣,关于哪一个可能更快。假设SQL Server和Web Server都在各自的计算机上运行,每个计算机都有足够的内存。

    现在我倾向于选择1。即使有更多的对数据库的查询,数据库本身也将完成所有的聚合工作,并且很少有数据在SQL服务器和Web服务器之间传递。对于选项2,只有一个查询,但它会将大量数据传递给.NET,然后.NET将不得不对聚合函数进行所有繁重的提升(尽管我没有任何基础,但我怀疑SQL Server在运行这些类型的大型聚合函数时更高效)。

    有没有想过该走哪条路(或者我错过的第三个选择)?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Rob Farley    15 年前

    数据库通常是分析此类数据的最佳选择,我会选择1。

    不过,我还考虑了第三个选项,其中创建了一个传递给SQL的查询(而不是10个)。这可能涉及到将case语句放入聚合函数中,这样您就可以在一次数据传递中完成所有工作。

    考虑一下做Pivot的旧方法:

    SELECT 
       SUM(CASE WHEN ConditionX = 1 THEN SomeField END) AS SUM1
       SUM(CASE WHEN ConditionX = 2 THEN SomeField END) AS SUM2
    FROM SourceData
    ;
    
        2
  •  1
  •   Chris    15 年前

    你知道,我会选择1。在我看来,50-150K行并不是那么多行,特别是如果没有太多的列。

    一旦你开始说上百万行,我就开始考虑优化。

    另一件事是:和数据库一样,确保查询正确命中索引。这比你两个想法的不同更重要。