在两个节点上的集群数据库(stado)中使用PostgreSQL。我成功地成功配置了stado协调器和节点代理,但是当我尝试运行一个繁重的查询时,第一次显示结果需要很长时间,之后就很快了。
当我重新启动服务器时,它再次变慢。这就像stado做一些缓存或其他东西。我认为这个问题是因为stado初始化并因此配置了代理但仍然存在问题!有什么想法吗?
修改
查询:
SELECT id,position,timestamp
FROM table t1
WHERE id <> 0
AND ST_Intersects(ST_Buffer_Meters(ST_SetSRID(
ST_MakePoint(61.4019, 15.218205), 4326), 1160006), position)
AND timestamp BETWEEN '2013-10-01' AND '2014-01-01';
说明:
ٍٍStep 0
_______
Target: CREATE UNLOGGED TABLE "TMPTT7_1" ( "XCOL1" INT) WITHOUT OIDS
SELECT: SELECT count(*) AS "XCOL1" FROM "t1" WHERE "t1"."timestamp" BETWEEN '2013-10-01' AND '2014-01-01' AND ("t1"."id"<>0) AND ST_Intersects(ST_Buffer_Meters(ST_SetSRID(
ST_MakePoint(61.4019, 15.218205), 4326), 1160006), "t1"."position")
Step: 1
_______
Select: SELECT SUM("XCOL1") AS "EXPRESSION6" FROM "TMPTT7_1"
Drop:
TMPTT7_1
答案 0 :(得分:0)
有两个原因。
显然,缓存。当第一次使用冷缓存执行查询时,显然会填充缓存。这适用于系统缓存和数据库缓存,两者一起工作,至少在标准的Postgres中。可以产生巨大的差异。
可能是查询计划缓存。要小得多。如果您在一个会话中重复运行相同的查询,则缓存PL / pgSQL函数的计划。
根据您与数据库的连接类型,可能还存在网络延迟,第一次通话可能会更高。
答案 1 :(得分:0)
内存缓存是正确的原因。对于这种情况,一个很好的建议是'#34;热身&#34;每次使用运行查询的脚本(或仍然访问相同数据的类似查询)重新启动数据库时,数据库。在某些情况下,我已经看到过多次&#34;热身&#34;查询在任何类型的重新启动后运行,然后用户仍然有良好的体验。在重新启动后,您仍然需要等待预热查询完成,但至少它不会是等待该用户的用户。
另一种可能性是您正在执行非索引查询,您应该检查它。如果它被索引并通过密钥访问合理数量的数据,那么它应该很快(即使没有大多数查询的预热)。这是一个非常普遍的问题,容易错过。使用Postres EXPLAIN命令,它将显示如何对数据库执行查询(即,使用索引或不使用索引)。