2

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

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

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

4

3 回答 3

1

只需根据需要操纵您的订单和组子句。

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

于 2008-09-17T14:28:20.470 回答
1

@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。我知道你的痛苦。

于 2009-02-25T21:36:39.820 回答
0

我的直觉告诉我,答案与数据透视表大纲有关,它具有固定数量的区域,即:

- 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. 

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

于 2008-09-17T14:55:54.133 回答