为什么一个简单的查询需要花费太多时间PostgreSQL?

时间:2014-01-27 04:58:22

标签: performance postgresql

为什么简单查询需要很长时间才能执行超过1秒(您可以看到日志文件:http://tny.cz/1fa5d842)在预准备语句中传递的查询。 在控制台中,它的执行时间不到30毫秒。 查询太简单了。你能帮忙解决这个问题吗? 非常感谢你的帮助。
操作系统:Windows 7
Postgresql 9.3.2。

RhodiumToad帮我解决了这个问题。 在(pl / pgsql)中有一个函数(相等)写入whitch使得数字和字符之间相等。我将此函数从pl / pgsql更改为简单的内联函数。并且索引工作正常。

3 个答案:

答案 0 :(得分:0)

通过应用程序查询与通过控制台查询之间没有区别。如果您之前已经运行过一次查询以预热缓存,那么只有您的控制台查询可以更快地返回的原因。即使从控制台,它也应该花费1秒多。

您发布的日志行显示您的查询正在执行顺序扫描。

`Seq Scan on public.fda_agriculteur  (cost=0.00..115524.50 rows=53792 width=24) (actual time=463.383..1122.579 rows=1 loops=1)`

这肯定会比索引扫描花费更多的时间。随着表中记录数量的增长,它将逐渐变得更糟。您应该在fda_agriculteur.FDA_Agriculteur_ID上创建索引。这将大大提高查询速度。

答案 1 :(得分:0)

我从未使用过postgresql,但是你的日志文件提到了一些听起来像线索的内容。

Seq Scan on public.fda_agriculteur  (cost=0.00..115524.50 rows=53792 width=24)
    (actual time=463.383..1122.579 rows=1 loops=1)

这听起来很像SQL Server中的表扫描。你的[推测]主键列上有任何索引吗?

CREATE UNIQUE INDEX PK_FDA_Agriculteur ON fda_agriculteur ( FDA_Agriculteur_ID ) 

答案 2 :(得分:0)

我相信问题是列的数据类型与值的数据类型不匹配:

WHERE fda_agriculteur.FDA_Agriculteur_ID = $1

$1 = '1054998'

可能正在转换列以匹配值的文本类型,因此无法使用索引。

尝试使用与列相同类型的显式强制转换:

WHERE fda_agriculteur.FDA_Agriculteur_ID = $1::int

我看到postgres特别愚蠢的铸造。很多年前我遇到了这个问题 - 看起来事情没有改变。