如何以编程方式快速构建即席查询?

时间:2008-09-17 14:24:54

标签: pivot-table adhoc-queries

我使用Excel数据透视表来分析数据库中的数据,因为它允许我非常快速地“切片和切块”。正如我们知道数据库表中的内容,我们都可以编写执行数据透视表的SQL查询。

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

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

3 个答案:

答案 0 :(得分:1)

根据需要操纵您的订单和小组条款。

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

答案 1 :(得分:1)

@Mark Ransom肯定会把Excel的概念保存在内存中,使计算速度更快。 Excel也可能以这样的方式对数据集进行预索引,使其比数据库更具响应性。

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

但有一点可以肯定:尽管数据库是生成准确报告的绝佳工具,但传统规范化的数据库对于即席查询来说远不是最佳的。因为规范化的数据结构首先关注完整性(如果我可以采取这种自由),他们牺牲了特殊的优化,代价是保持所有数据的合理性。虽然这是一个很糟糕的例子,但请考虑这个规范化的模式:

+--------+     +---------+
|tblUsers|     |luGenders|
+--------+     +---------+
|userID  |     |genderID |
|genderID||gender   |
+--------+     +---------+

SELECT * FROM luGenders;
> 1 Female
> 2 Male

如果在这个例子中,我们希望知道系统中女性/男性用户的数量,那么数据库将需要处理连接并相应地表现(再次,由于连接数较少,这是一个不好的例子并且可能的值很少,这通常应该带来一些数据库引擎优化)。但是,如果您要将此数据转储到Excel,您仍然会因为拉取数据而导致数据库损失,但实际上在Excel中旋转数据会相当快。你可能会因为你的Excel比直接的即席查询更快而错过这种前期固定成本惩罚的概念,但我没有数据可以评论。

然而,最切线的一点是,虽然一般数据库对准确性有好处,但它们往往会对临时报告感到厌烦。为了生成临时报告,通常需要在更易查询的结构中对数据进行反规范化(“仓库”)。查找有关数据仓库的信息将在该主题上提供很多好的结果。

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

我强烈推荐The Data Warehouse Toolkit。为了记录,我不是DBA,我只是一个低级分析师,他每周花费80个小时来修改Excel和Oracle。我知道你的痛苦。

答案 2 :(得分: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. 

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

相关问题