2011-01-27 78 views
1

我有一个基于Postgresql的数据仓库。测试数据仓库性能的最佳方法?

到现在为止,我一直在试图在包含我的真实数据库的一小部分的数据库上运行查询。一旦我以这种方式编写查询以使其对这个小型测试数据库有效,我就可以在真实的数据库上运行这些查询。

问题是,一旦我在真实数据库上运行查询,真正的数据库将耗尽内存并开始将诸如索引和临时表之类的内容写入磁盘。这意味着对于测试数据库和真实数据库来说,不同的查询可能是最优的。这是否意味着我必须运行需要几分钟才能完成的查询才能知道哪个查询是最优的。

回答

1

了解如何解释EXPLAIN输出,然后在运行查询之前检查EXPLAIN输出是否显示大型数据库中选定的查询计划与您所期望的类似。

0

三个问题:

1)查询有多复杂?索引和临时表的生成表明服务器必须生成这些东西,因为在未编制索引的列上进行复杂的操作。这有多可能?从你的报告看来,可能的答案似乎是“复杂的”

2)回报集有多大?最终结果是100行还是100万?从你的报告中,答案可能是任何事情。我怀疑这个问题并不重要,但至少知道这一点至关重要。

3)以不同的方式重新提出问题1,即使返回的集合很小,是否有巨大的中间结果必须在小结果的基础上编译?再次,我怀疑这里的答案是正在生成大型复杂的中间结果。

这意味着至少有些事情需要编制索引,并且可能需要将数据结构化,以便更接近您想要查询的内容。

最后一个问题是,对于大多数更重要的查询或者只有一两个问题,这是一个普遍的问题?

编辑回复评论:我整天在做数据仓库查询,其中一些需要10分钟左右。有些需要几个小时,我把它们推到一个后台工作中,并分解成几个阶段,以防止一切陷入困境。这是处理非常大的数据集的本质。

我在最初的答案中的问题旨在弄清楚如果您的问题查询将有史以来完成。有可能在不知情的情况下编写一个查询,产生如此多的中间数据,您可以走开,2天后回来,并且它仍在运行。所以我会重申我原来的三个问题,它们实际上是完全回答你的问题的唯一方法。

回顾:是的,有些查询需要更长时间,这是野兽的性质。您希望的最好效果是与正在读取的数据量成线性关系,并且如果有一亿行要处理,则需要几分钟而不是几秒钟。但更重要的是,如果一个查询在100万行中运行时间为4秒,但在1亿行上需要>> 400秒(如一小时),那么我询问的那些原始问题将帮助您找出原因,以便优化这些查询。

+0

我不问如何优化查询,我问如何测试它。我希望能够测试任何查询,复杂,简单,大型回报集,小型回报集,大型中间结果,小型中间结果。如何在不等待几分钟的情况下测试性能? – David 2011-01-31 00:08:03