【问题标题】:How do I programmatically build ad-hoc queries quickly?如何以编程方式快速构建临时查询?
【发布时间】:2008-09-17 14:24:54
【问题描述】:

我使用 Excel 数据透视表来分析我的数据库中的数据,因为它允许我非常快速地“切片和切块”。由于我们知道数据库表中有什么,我们都可以编写 SQL 查询来完成数据透视表的工作。

但我想知道为什么 PivotTable 可以如此快速地构造查询,而它对数据一无所知以及我们给它的数据字段之间的含义/关系?

换个方式,我们如何才能以如此快速有效的方式构建ad-hoc SQL 查询? (“当然是使用数据透视表!”,是的,但我想要的是一种编程方式)。

【问题讨论】:

  • 我猜在微软写这些东西的人对数据的看法不同。如果你有一个数据透视表连接到一个多维数据集,它不是使用 SQL 来查询数据,而是使用 MDX。它可能与 excel PT 做类似的事情。

标签: pivot-table adhoc-queries


【解决方案1】:

只需根据需要操作您的 order 和 group 子句。

Excel 速度很快,因为所有数据都在内存中,并且可以快速高效地进行排序。

【讨论】:

  • 老兄 - 喜欢你所做的 Valerie 的 Amy Winehouse 封面
  • 我想你把我和来自 markransom.com 的人搞混了?那不是我。
【解决方案2】:

@Mark Ransom 肯定会使用 Excel 将数据保存在内存中的概念,使其计算速度更快。 Excel 也有可能以使其比您的数据库更具响应性的方式预先索引数据集。

为什么它更快有一个重要的、非算法的可能性:在数据透视表的使用中,Excel 没有连接的概念。当您从数据库中获取临时数据时,表之间的任何连接或关联都会导致进一步的查找、扫描、索引加载等。由于 Excel 将所有数据都放在一个位置(RAM 或没有),它可以无需预先形成数据集即可执行查找。如果您要将数据库数据加载到临时表中,那么看看针对该表的即席查询是如何在性能方面与 Excel 叠加起来的,将会很有趣。

但有一点可以肯定:尽管数据库是生成准确报告的绝佳工具,但传统上标准化的数据库对于即席查询而言远不如最佳选择。因为规范化的数据结构将完整性放在首位(如果我可以冒昧的话),它们牺牲了特别优化,以牺牲所有数据的合理性为代价。尽管这是一个糟糕的示例,但请考虑以下标准化模式:

+--------+ +---------+ |tbl用户| |lu性别| +--------+ +---------+ |用户名 | |性别ID | |性别ID||性别| +--------+ +---------+ 从 luGenders 中选择 *; > 1 名女性 > 2 男

在这个例子中,如果我们想知道系统中女性/男性用户的数量,数据库需要处理连接并做出相应的行为(同样,这是一个不好的例子,因为连接数量很少和少量可能的值,这通常会带来一些数据库引擎优化)。但是,如果您要将这些数据转储到 Excel 中,您仍然会因提取数据而遭受一些数据库损失,但实际上在 Excel 中旋转数据会相当快。可能是您认为 Excel 比直接的临时查询更快的想法忽略了这种预先固定成本惩罚的概念,但我没有要评论的数据。

不过,最切题的一点是,虽然通用数据库有利于提高准确性,但它们通常会吸收临时报告。要生成临时报告,通常需要以更可查询的结构对数据进行去规范化(“仓库”)。查找有关数据仓库的信息将在该主题上提供很多好的结果。

故事的寓意:拥有一个完全算法、快速的临时查询系统是一个了不起的理想,但在给定的空间和时间限制(内存和工时)的情况下并不实用。要有效地生成临时系统,您确实需要了解数据的用例,然后有效地对其进行非规范化。

我强烈推荐The Data Warehouse Toolkit。郑重声明,我不是 DBA,我只是一个卑微的分析师,每周花费 80 小时处理 Excel 和 Oracle。我知道你的痛苦。

【讨论】:

    【解决方案3】:

    我的直觉告诉我,答案与数据透视表的轮廓有关,它有一个固定个区域,即:

    - the Page Fields zone  
    - the Column Fields zone  
    - the Row Fields zone and
    - the Data zone
    

    我的猜测是:

    - The Page zone builds the WHERE part of the ad-hoc query.  
    - The Column zone will put whichever fields drag-dropped to it in the GROUP BY clause.  
    - The Row zone will build a SELECT DISTINCT <field names>
    - The Data zone will apply an AGGREGATE function to the field drag-dropped to it. 
    

    当我们将字段拖到这些区域时,您认为“幕后”会发生什么?

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多