我有一个基于PostgreSQL的数据仓库。

到目前为止,我一直在尝试在包含我真实数据库的一小部分的数据库上运行查询。一旦我以一种使它们有效地为这个小型测试数据库有效的方式编写了查询,我就会在真实的测试数据库上运行查询。

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

有帮助吗?

解决方案

学习如何解释 EXPLAIN 输出,然后检查 EXPLAIN 输出表明,在运行查询之前,大型数据库中所选的查询计划与您期望的相似。

其他提示

三个问题:

1)查询有多复杂?索引和温度表的生成表明,由于在未索引列上进行了复杂的操作,服务器必须生成这些东西。这有多大的可能性?根据您的报告,似乎答案可能是“复杂”

2)收益集有多大?最终结果是100行还是100万行?根据您的报告,答案可能是什么。我怀疑这个问题并不重要,但至少要知道这一点很重要。

3)以不同的方式重述问题1,即使返回的集合很小,是否有巨大的中间结果必须在到达小结果的过程中进行编译?同样,我怀疑这里的答案是正在生成大型复杂的中间结果。

这表明至少有些事情需要索引,也许需要在途中构造数据才能更接近您要查询的内容。

最后一个问题是,这是您大多数更重要的查询,还是仅针对一两个问题,这是一个普遍的问题吗?

对评论的回应进行编辑: 我整天进行数据仓库查询,其中一些需要10分钟左右。有些需要几个小时,我将它们推入后台工作,并将它们分为阶段,以防止一切陷入困境。这就是处理非常大的数据集的性质。

我在原始答案中的问题旨在弄清楚您的问题查询是否会 曾经 结束。可以不知不觉地编写一个产生如此多的中间数据的查询,您可以走开,2天后回来,并且仍在运行。因此,我将重申我最初的三个问题,实际上,它们是完全回答您问题的唯一方法。

回顾:是的,有些查询需要更长的时间,这是野兽的本质。您所希望的最好的是读取的数据量的性能线性,如果要处理1亿行,这将需要几分钟而不是秒。但更重要的是,如果查询在100万行中在4秒内运行,但是在1亿行上需要>> 400秒(如一个小时),那么我问的那些原始问题将帮助您弄清楚为什么,以优化目的那些查询。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top