我有一个基于Postgresql的数据仓库。
到目前为止,我一直在尝试对只包含我真实数据库的一小部分的数据库运行查询。一旦我以一种使它们对这个小型测试数据库有效的方式编写查询,我就会在真实的数据库上运行查询。
问题是,一旦我在真实数据库上运行查询,真实数据库就会耗尽内存并开始将索引和临时表等内容写入磁盘。这意味着对于测试数据库和真实数据库而言,不同的查询可能是最佳的。这是否意味着我必须运行需要几分钟才能完成的查询才能知道哪个查询是最佳查询。
答案 0 :(得分:1)
了解如何解释EXPLAIN
输出,然后在运行查询之前检查EXPLAIN
输出是否显示大型数据库中所选的查询计划与您的预期相似。
答案 1 :(得分:0)
三个问题:
1)查询有多复杂?索引和临时表的生成表明服务器必须生成这些东西,因为对未编制索引的列进行了复杂的操作。这有多大可能?根据您的报告,似乎可能的答案是“复杂”
2)回报有多大?最终结果是100行还是100万?根据您的报告,答案可能是任何事情。我怀疑这个问题并不重要,但至少重要的是要知道。
3)以不同的方式重述问题1,即使返回的集很小,是否有大量的中间结果必须在通往小结果的路上编译?同样,我怀疑这里的答案是生成大量复杂的中间结果。
这表明至少有些东西需要被编入索引,而且数据需要按照你想要查询的方式进行结构化。
最后一个问题,对于大多数更重要的查询,这是一个普遍存在的问题,还是仅针对一两个问题?
编辑回应评论:我整天都在进行数据仓库查询,其中一些需要10分钟左右。有些人需要几个小时,然后我将他们推到后台工作,并将他们分成几个阶段,以防止一切陷入困境。这是处理非常大的数据集的本质。
我在原始答案中的问题旨在确定您的问题查询是否 完成。有可能无意中编写一个产生如此多中间数据的查询,您可以离开,2天后返回,并且它仍然在运行。所以我会重申原来的三个问题,它们实际上是完全回答你问题的唯一方法。
回顾:是的,有些查询需要更长时间,这是野兽的本质。您可以期望的最佳性能是与读取的数据量呈线性关系,如果要处理1亿行,则需要几分钟而不是几秒钟。但更重要的是,如果一个查询在1百万行的4秒内运行,但在1亿行上需要>> 400秒(比如一个小时)然后我问的那些原始问题将帮助你找出原因,目的是优化这些查询。