追踪一个相当典型的EclipseLink/JPA应用程序中的一些DB性能问题。
我看到频繁的查询耗时25-100ms。这些是简单的查询,只是从主键等于某个值的表中选择所有列。他们不应该太慢。
我正在使用log_min_duration_statement查看postgres日志中的查询时间,因此这应该会消除任何网络或应用程序开销。
这个查询并不慢,但它经常被使用。
为什么按主键选择*会很慢?这是postgres特有的问题还是一般的DB问题?我怎么才能加快速度呢?总体而言?给postgres的?
来自pg日志的示例查询:
2010-07-28 08:19:08 PDT - LOG: duration: 61.405 ms statement: EXECUTE <unnamed> [PREPARE: SELECT coded_ele
ment_key, code_system, code_system_label, description, label, code, concept_key, alternate_code_key FROM coded
_element WHERE (coded_element_key = $1)]
表大约有350万行。
我还在这个查询上运行了EXPLAIN和EXPLAIN ANALYZE,它只做了一个索引扫描。
发布于 2010-07-28 16:44:28
Select *使您的数据库更难工作,通常情况下,这是一种糟糕的做法。在stackoverflow上有很多关于这方面的问题/答案。
你有没有试过用字段名替换*?
发布于 2010-07-28 16:41:50
你会遇到某种锁争用吗?在执行这些查询时,您采用的是哪种锁?
发布于 2010-07-28 16:42:41
嗯,我对postgres SQL了解不多,所以我将给你一个适用于MS SQL Server的提示。
MS SQL Server有“簇索引”的概念,它是数据在磁盘上的物理布局。在字段上使用它是很好的,因为你要寻找一个介于到值之间的范围(主要是日期字段)。如果您正在寻找一个确切值(如主键查找),则它没有太大用处。但是,有时会无意中将主键索引设置为聚集索引。这使得索引查找到表扫描中。
https://stackoverflow.com/questions/3355166
复制相似问题