我使用 Excel 数据透视表来分析数据库中的数据,因为它允许我非常快速地“切片和切块”。由于我们知道数据库表中有什么,我们都可以编写 SQL 查询来完成数据透视表的工作。
但我想知道为什么数据透视表可以如此快速地构建查询,而它对数据以及我们给它的数据字段之间的含义/关系一无所知?
换句话说,我们如何才能以如此快速有效的方式构建临时SQL 查询?(“当然,使用数据透视表!”,是的,但我想要的是一种编程方式)。
我使用 Excel 数据透视表来分析数据库中的数据,因为它允许我非常快速地“切片和切块”。由于我们知道数据库表中有什么,我们都可以编写 SQL 查询来完成数据透视表的工作。
但我想知道为什么数据透视表可以如此快速地构建查询,而它对数据以及我们给它的数据字段之间的含义/关系一无所知?
换句话说,我们如何才能以如此快速有效的方式构建临时SQL 查询?(“当然,使用数据透视表!”,是的,但我想要的是一种编程方式)。
只需根据需要操纵您的订单和组子句。
Excel 速度很快,因为所有数据都在内存中,并且可以快速高效地进行排序。
@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。我知道你的痛苦。
我的直觉告诉我,答案与数据透视表大纲有关,它具有固定数量的区域,即:
- 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.
当我们将字段拖到这些区域时,您认为“幕后”会发生什么?