了解并发SQL查询执行

时间:2015-07-27 16:14:36

标签: java sql multithreading postgresql

首先,我是DB编程的新手,以下对我来说有点奇怪。

我有以下非常大的表格(details):

id       name         name_details
PK     varchar(32)    varchar(32)
--------------------------------
 1      'core'         'xAj6l3Fg5d'
 2      'core'         '8lEfs01nkf'
 3      'smt'          'oij3Gll4d6'
...................................

我需要编写以下查询:

SELECT name_details
FROM details
WHERE name = 'core' OR name = 'smt'

我注意到如果我在PGAdmin中打开两个单独的窗口并执行这两个查询:

SELECT name_details
FROM details
WHERE name = 'core'

SELECT name_details
FROM details
WHERE name = 'smt' 

如果只执行一个查询,执行时间几乎与我相同。所以,我假设每个SQL连接都在自己的线程中处理。我有16核系统。

问题:将整个查询拆分成较小的部分(16)并执行不同线程中的任何部分通常很有用吗?它通常对执行处理大量数据的查询很有用吗?

特别是,我使用ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() \*cores*\, \* other_params *\)来处理它。

2 个答案:

答案 0 :(得分:1)

所有查询大致相同时间的一个可能原因可能是简单的表扫描。

在这种特殊情况下,假设没有索引,postgres将只读取整个表。它还会在读取时缓存一些记录。

在您的单个查询场景中,它会读取每个记录,稍微缓存它,丢弃它。

在两个查询场景中,每个查询都将进行表扫描,但每当第二个查询想要访问特定块时,它可能会发现第一个查询已将其加载到缓存中,因此不需要磁盘访问。在磁盘访问方面,第二个查询实际上是免费的。

如果表在名称上编入索引,这显然会完全不同,因为每个查询只会访问感兴趣的表中的那些部分。

答案 1 :(得分:0)

通常,您不应拆分查询。 DBMS负责高效执行,您应该信任该系统。 "优化"正如您所建议的那样,应该只在极少数情况下才会这样做(而且首先只会出现性能问题)。此外,那些"优化"如果你不太了解自己在做什么(即只有专家用户应该谨慎行事),那么就可以"反击",即导致性能不佳。

@Gary已经解释了为什么它会在您观察时表现出来的一些细节。