【问题标题】:Fastest way to query a SQL Database from Excel?从 Excel 查询 SQL 数据库的最快方法?
【发布时间】:2011-10-31 21:01:42
【问题描述】:

我将从 Excel 中构建一些添加功能,以实现 让用户从 Excel 执行临时报告。

显而易见的方法是通过针对 ODBC 数据源的 SQL 语句, 但我担心它不能很好地扩展到一个巨大的表(即:对包含 50 千兆数据的表执行 SUM 或 COUNT 会导致性能问题)

我一直在考虑使用某种缓存技术,基本上是在 RAM 中查询 数据:http://www.yellowfinbi.com/wp_inmemory.pdf 这在 RAM 中的成本可能很高,而且我不太确定实现起来有多么困难。

我的约束如下:

  • 我应该能够从 Excel 查询任何类型的数据源(SQL Server、MySql)

  • 临时报告将从 Excel 执行(通过我的加载项)

  • 应尽快将查询结果发送回 Excel 单元格

  • 我不想构建 Datawarehouse 或 Olap 多维数据集,而是查询数据源

对算法、实现技术(In-Ram 报告?)有什么建议,以便以最优化的方式从 Excel 中执行临时查询? (除了优化的 SQL 代码!)

【问题讨论】:

  • 我怀疑 RDBMS 实现者已经投入大量精力来提高 RDBMS 中这些聚合操作的性能(这可能取决于实际系统和配置)。如果将数据拉入 Excel(可能是 RAM)可以做得更好(尤其是如果您没有 50GB 的 RAM),我会感到惊讶。您是否倾向于对至少可以缓存的特定子集执行这些查询?
  • 在 RDBMS 和您的 Excel 插件之间传输数据所需的时间(如果数量如您所说的那样大),即使不包括聚合值的计算和/或存储到 RAM 也会无疑也超过了在 RDBMS 本身内执行此操作所需的时间,然后才传输聚合结果。
  • 您对 ODBC/SQL 的关注不在于可用性吗(对于不了解 SQL 的 Excel 用户,或者您似乎正在寻找与不同类型的 SQL 服务器兼容的东西),而不是可扩展性?
  • 您会遇到困难,因为“我不想构建 DW 或 OLAP”与“尽可能快地处理 50 千兆数据”不一致。您不能将 50 GB 的原始数据拉到客户端并期望任何速度。您希望获得任何体面性能的唯一方法是构建一些服务器端/数据库端来预聚合和/或过滤以将其筛选到更小的数量。
  • PowerPivot 是我所知道的最接近您想要的东西,但是对于如此大量的数据,它仍然会很慢,因为它将在客户端构建多维数据集并且需要大量ram 的数量。

标签: sql excel optimization reporting


【解决方案1】:

PowerPivot 是一个选项,它是 Excel 的免费插件,针对以这种方式聚合(求和/计数)数据进行了优化。

它确实需要足够的 RAM 来缓存来自服务器的数据。

【讨论】:

    【解决方案2】:

    “(即:对包含 50 千兆数据的表执行 SUM 或 COUNT 将导致性能问题)”

    这正是您可能不想在客户端缓存数据的原因。除非每个用户都有自己的小型超级计算机和 64 GB RAM,否则您需要减少遇到的行数。

    事实上,大多数用户认为大型报告毫无用处。我们的大脑在短期记忆中只能保留不到十几个值。因此,用户将无法从大量数据中收集到任何有用的信息。

    他们需要进行分析,通常分析涉及聚合或过滤的数据

    您可以使用或组合使用两个选项:

    1) 实现预先聚合数据的视图。许多数据库引擎都有物化视图或 SQL 服务器中的无扩展选项,基本上可以让您预先聚合报告。 如果您试图避免这种情况,并让您的插件处理它,那么您基本上是在构建一个 OLAP 引擎,并且应该查看 OLAP 系统使用的算法(这正是 PowerPivot 已经具备的)。

    这个想法是让数据库引擎做它擅长的事情,将行数减少到更接近客户需求的聚合数量。这可确保您不会通过网络发送大量数据并要求客户端处理该数据并缓存在 ram 中。

    2) 使用 WHERE 条件/SP 参数传递过滤条件,以减少仅返回绝对需要的行数。这里有发挥真正创意的空间,比大多数人意识到的要多。例如,您的表可能包含一些用户无权访问的数据,因此加入授权表(或您用于访问控制的任何机制)并过滤掉他无权访问的任何数据是有意义的。

    要求用户选择过滤器以将数据过滤到合理的数量。

    用户想要的数据超出他们的吞咽能力是很常见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多