2010-07-28 83 views
8

追溯相当典型的EclipseLink/JPA应用程序中的一些数据库性能问题。在什么情况下SELECT可以通过PRIMARY KEY慢?

我看到频繁的查询需要25-100ms。这些都是简单的查询,只需从主键等于某个值的表中选择所有列即可。他们不应该慢。

我正在查看postgres日志中的查询时间,使用log_min_duration_statement,因此这应该消除任何网络或应用程序开销。

此查询不是缓慢的,但它经常使用。

为什么选择主键的速度会很慢? 这是特定于postgres还是通用数据库问题? 我该如何加快速度?一般来说?对于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,它只进行索引扫描。

+0

数据集有多大?每一行有多大?查询是什么样的? – 2010-07-28 16:38:13

+0

你有数据库集群吗?发布前您是否进行过真空全分析?什么Pg版本? – jmz 2010-07-28 19:08:31

+0

没有集群,也不是真正的选项。我还没有完成真空分析(我会),这是PG 8.1。 – Freiheit 2010-07-28 20:19:58

回答

4

Select *使您的数据库更难工作,而且作为一般规则,这是一种不好的做法。有关于stackoverflow谈论的问题/答案很多。

你试过用字段名替换*吗?

+1

JPA根据字段名称描述生成查询。为简洁起见,我将其描述为“Select *”。 – Freiheit 2010-07-28 16:54:52

+0

啊 - 你不值得这么做:-)还有其他一些事情可能会影响证书...压缩表或重建索引可以提供帮助,设置索引填充比读写更有利于读取,分区(是否在一个较慢的驱动器上),计算列,改变SELECT中的字段顺序(为什么?我仍然不知道)等。 – dave 2010-07-28 17:22:42

+0

接受的主要是后续评论,而不是最初的答案。给我一个理解和检查的列表,以加快查询速度。 – Freiheit 2010-08-02 14:42:16

2

你可能会得到某种锁定争用?执行这些查询时,你正在使用什么类型的锁?

+0

我不确定。有没有办法让PG或JPA告诉我何时发出锁? – Freiheit 2010-07-28 16:55:25

2

那么,我不太了解postgres SQL,所以我会给你一个适用于MS SQL Server的技巧。

MS SQL Server具有“群集索引”的概念,该群集索引是磁盘上数据的物理布局。在你要寻找值之间的范围(主要是日期字段)的领域使用它是很好的。如果你正在寻找一个确切的值(比如主键查找),这没什么用处。但是,有时主键索引被无意设置为聚簇索引。这使索引查找到表扫描。

+0

如何使用主键的聚集索引将主键上的索引查找转化为表扫描? – 2010-07-28 21:16:35

+0

因为表是索引。因此“索引扫描”==“表扫描” – 2010-07-28 23:15:56

+0

但是索引查找不会成为索引扫描,除非我把我的术语搞砸了。 – 2010-08-03 19:20:47

1

select *几乎总是一个非常非常糟糕的主意。

  1. 如果字段的顺序发生变化,它会破坏你的代码。 根据评论,这并不重要,因为你正在使用的抽象库。
  2. 您可能从表中返回的数据比实际需要的数量多。选择您想要的特定字段可以节省传输时间。

25ms是几乎任何类型的SQL查询都会看到的下限 - 只有两个磁盘访问!您可能想要考虑减少查询运行次数的方法,而不是尝试优化查询。

+0

我真的希望人们会在他们倒退时吓倒评论! – 2010-07-28 17:56:34

+1

@比利,你在两个账户中是错误的:1.除非你删除表格,否则字段顺序不会改变。 25ms对于PK来说是非常长的时间。然而,这不是倒退的原因。你没有回答这个问题,那就是如何解决这个问题,而不是你在25ms内获得多少次随机磁盘访问。 – jmz 2010-07-28 19:06:07

+0

@jmz:ALTER也可以更改字段顺序。至于这个问题,我相信这是'为什么主键选择慢*',接着是'我怎样才能加快速度?',在这种情况下,我看不出这怎么回答这个问题。 – 2010-07-29 02:35:16

1

该行异常大或包含BLOB和大二进制字段?

这是直接通过控制台还是这个查询通过一些数据访问API,如jdbc或ADO.NET运行?您提到JPA看起来像数据访问API。对于短的查询,数据访问API会占用更大的执行时间 - 创建命令,创建对象来保存行和单元格等。

+0

这些查询速度是从postgres日志中记录的,所以它是实际的查询时间,而不是数据API(JPA)时间。 – Freiheit 2010-07-28 17:25:37

相关问题