【问题标题】:Perform Data Analysis on Sql Server or in .Net?在 Sql Server 或 .Net 中执行数据分析?
【发布时间】:2009-10-18 20:49:07
【问题描述】:

我有一些数据分析需要执行。平均而言,它将涉及 50K-150K 行之间的某处。从这些行中,我需要根据五个不同的标准提取 Sum(X) 和 Count(X) 的总和。有两种方法:

  1. 编写 10 个不同的查询,每个查询都旨在使用 Sum() 或 Count() 聚合列 X 中的数据。运行每一个并使用 SqlCommand.ExecuteScalar() 检索结果。
  2. 创建一个自定义对象以包含评估不同条件所需的所有不同参数。使用 SqlCommand.ExecuteDataReader() 运行一个查询,该查询将返回构成包含所有不同条件子集的超集所需的所有数据。将 DataReader 中的每一行读入一个新对象,并将每一行添加到一个 List 集合中。取回所有数据,使用 Linq-to-Object 根据不同条件确定所需的不同 Sum() 和 Count() 值。

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

现在我倾向于选项 1。尽管对 DB 的查询更多,但 DB 本身将完成所有聚合工作,并且很少有数据会在 Sql Server 和 Web Server 之间传递。使用选项 2,只有一个查询,但它会将大量数据传递给 .Net,然后 .Net 将不得不完成与聚合函数有关的所有繁重工作(尽管我没有有什么依据,我怀疑 Sql Server 在运行这些类型的大聚合函数时效率更高)。

关于走哪条路(或我缺少的第三种选择)有什么想法吗?

【问题讨论】:

  • 这是一次性的事情,还是需要重复?如果您需要重复它,查询是否会发生变化?不同的日期范围之类的?
  • 需要重复。并且每次需要重复时,都必须重新生成 sql,因为用于聚合和过滤的重要列的列名会发生变化(因此 LinqToSql 不是一个选项)。

标签: c# .net asp.net sql-server aggregate


【解决方案1】:

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

不过,我还会考虑第三种选择,即创建一个传递给 SQL 的查询(而不是十个)。这可能涉及将 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
;

【讨论】:

  • 我同意,第三种选择可能是最好的选择;如果 OP 可以提供样本数据,那么肯定会更容易说。每当我听说我需要编写 x 个在不同列上执行相同操作的查询时,我就会开始想知道如何减少这个数量。
【解决方案2】:

你知道,我会选择选项 1。50-150k 行并不是真正的多行 IMO,尤其是在你没有太多列的情况下。

一旦你开始谈论数百万行,我就会开始考虑优化。

另一件事:与数据库一样,确保您的查询正确命中索引。这比你的两个想法之间的差异重要得多。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2015-03-09
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多