为什么简单查询需要很长时间才能执行超过1秒(您可以看到日志文件:http://tny.cz/1fa5d842)在预准备语句中传递的查询。
在控制台中,它的执行时间不到30毫秒。
查询太简单了。你能帮忙解决这个问题吗?
非常感谢你的帮助。
操作系统:Windows 7
Postgresql 9.3.2。
RhodiumToad帮我解决了这个问题。 在(pl / pgsql)中有一个函数(相等)写入whitch使得数字和字符之间相等。我将此函数从pl / pgsql更改为简单的内联函数。并且索引工作正常。
答案 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特别愚蠢的铸造。很多年前我遇到了这个问题 - 看起来事情没有改变。