Performance 从8.3开始,您是否观察到PostgreSQL临时表性能下降?

Performance 从8.3开始,您是否观察到PostgreSQL临时表性能下降?,performance,postgresql,Performance,Postgresql,我的应用程序在PostgreSQL中使用临时表。 与新的8.4版本相比,我测试了它的性能 到旧的8.2版本,我观察到临时表 速度要慢十倍 8.3版本的测试表明,8.3版本的速度也较慢。我比较了所有的配置 碱基和它们是相似的。所有基地都在同一个基础上工作 服务器。当我的应用程序使用JDBC驱动程序时,我使用了Jython 要测试它,请执行以下操作: import time import traceback import sys from java.sql import DriverManager

我的应用程序在PostgreSQL中使用临时表。 与新的8.4版本相比,我测试了它的性能 到旧的8.2版本,我观察到临时表 速度要慢十倍

8.3版本的测试表明,8.3版本的速度也较慢。我比较了所有的配置 碱基和它们是相似的。所有基地都在同一个基础上工作 服务器。当我的应用程序使用JDBC驱动程序时,我使用了Jython 要测试它,请执行以下操作:

import time
import traceback
import sys

from java.sql import DriverManager
from java.lang import Class

Class.forName("org.postgresql.Driver")

def test_bench(db, temp):
    if temp:
        temp_str = ' TEMP '
        temp_desc = 'temp   '
    else:
        temp_str = ' '
        temp_desc = 'regular'
    try:
        c = db.createStatement()
        c.execute("CREATE %s TABLE test_table_md_speed(id serial primary key, txt varchar(100))" % temp_str)
        cnt = '?'
        try:
            t0 = time.time()
            for i in range(1000):
                c.execute("INSERT INTO test_table_md_speed(txt) VALUES ('ala ma %d kota')" % i)
            t2 = time.time()
            rs = c.executeQuery("SELECT COUNT(*) AS ile FROM test_table_md_speed")
            while (rs.next()):
                cnt = rs.getString(1)
            print("%s\ttime: %7.3f [s]\tcnt: %s" % (temp_desc, (t2-t0), cnt))
        finally:
            c.execute("DROP TABLE test_table_md_speed")
        c.close()
    except:
        print("\nthere were errors!")
        s = traceback.format_exc()
        sys.stderr.write("%s\n" % (s))

def test_db(db_url, usr, passwd):
    print("\n\n--------------")
    db = DriverManager.getConnection(db_url, usr, passwd)
    try:
        c = db.createStatement()
        rs = c.executeQuery("SELECT version()")
        while (rs.next()):
            print('ver: %s' % (rs.getString(1)))
        test_bench(db, 0)
        test_bench(db, 1)
    finally:
        db.close()

test_db('jdbc:postgresql://db-test64:5432/db_stable?stringtype=unspecified', 'postgres', 'postgres')
test_db('jdbc:postgresql://db-test64:5434/db_stable?stringtype=unspecified', 'postgres', 'postgres')
test_db('jdbc:postgresql://db-test64:5435/db_stable?stringtype=unspecified', 'postgres', 'postgres')
我还使用win32中的ActivePython和odbc编写了类似的测试,该程序显示了相同的结果。 我的结果:

C:\tools\pyscripts\>jython jdbc_pg_bench.py
--------------
ver: PostgreSQL 8.2.12 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
regular time:  12.016 [s]       cnt: 1000
temp    time:   1.187 [s]       cnt: 1000
--------------
ver: PostgreSQL 8.3.6 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
regular time:  11.922 [s]       cnt: 1000
temp    time:  10.516 [s]       cnt: 1000
--------------
ver: PostgreSQL 8.4.0 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), 64-bit
regular time:  13.375 [s]       cnt: 1000
temp    time:  13.609 [s]       cnt: 1000
在8.3和8.4版本中,您是否观察到温度表的速度降低? 是否有关于临时表行为变化的任何信息

编辑

我在我的Windows计算机上安装了PostgreSQL 8.2和8.4,并用10000个插入进行了测试,似乎8.2在使用临时表时要快得多:

ver: PostgreSQL 8.2.11 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)
regular time:  40.672 [s]       cnt: 10000
temp    time:  14.859 [s]       cnt: 10000

ver: PostgreSQL 8.4.0, compiled by Visual C++ build 1400, 32-bit
regular time:  56.860 [s]       cnt: 10000
temp    time:  49.110 [s]       cnt: 10000

我检查过了,但我不能重复你的结果。在我的电脑上,插入到临时表的速度与我测试的所有版本相似。这有点奇怪,所以在comp上8.2.12的insert比insert到常规表的速度快10倍。在我的计算机上,插入到临时表的速度大约是插入到常规表的速度的1.5-2倍。

我检查了它-但我不能重复您的结果。在我的电脑上,插入到临时表的速度与我测试的所有版本相似。这有点奇怪,所以在comp上8.2.12的insert比insert到常规表的速度快10倍。在我的计算机上,插入到临时表的速度大约是插入到常规表的速度的1.5-2倍。

8.3引入了此更改:(来自)

tgl创建一个GUC参数
temp_tablespaces
,该参数允许选择存储临时表和临时文件的表空间。这是一个允许跨多个表空间分散负载的列表(每次创建临时对象时都会选择一个随机列表元素)。临时文件不再存储在每个数据库
pgsql\u tmp/
目录中,而是存储在每个表空间目录中

归功于“海梅·卡萨诺娃、阿尔伯特·塞维拉、伯恩德·赫尔默”


列表中有一个可能相关的报告。然而,原始海报确定了以下内容:

“所以我怀疑,你所看到的经济放缓是因为制造了一个 8.3中目录更新的次数较多;”



您关于8.3复制了8.2配置的评论。。。默认自动真空设置从关闭变为打开。可能您的临时表在8.3中被抽真空,但在8.2中没有抽真空?

8.3引入了此更改:(来自)

tgl创建一个GUC参数
temp_tablespaces
,该参数允许选择存储临时表和临时文件的表空间。这是一个允许跨多个表空间分散负载的列表(每次创建临时对象时都会选择一个随机列表元素)。临时文件不再存储在每个数据库
pgsql\u tmp/
目录中,而是存储在每个表空间目录中

归功于“海梅·卡萨诺娃、阿尔伯特·塞维拉、伯恩德·赫尔默”


列表中有一个可能相关的报告。然而,原始海报确定了以下内容:

“所以我怀疑,你所看到的经济放缓是因为制造了一个 8.3中目录更新的次数较多;”



您关于8.3复制了8.2配置的评论。。。默认自动真空设置从关闭变为打开。也许您的临时表在8.3中被真空化了,但在8.2中没有?

谢谢您的测试。我将在另一台计算机上重复我的测试。我在Windows计算机上进行了新安装的测试,正如我在查询中添加的,8.4上的常规表和临时表几乎没有区别,而8.2上的临时表速度更快。感谢您的测试。我将在另一台机器上重复我的测试。我在Windows机器上用新安装进行了测试,正如我在查询中添加的,8.4上的常规表和临时表几乎没有区别,而8.2上的临时表速度更快。非常感谢!我找了,但没找到!您是否将8.2 per database pgsql_tmp目录放置在比磁盘其余部分快10倍的位置?否。Linux机器的管理员将8.2 config复制到8.3并更改了端口和目录,但所有内容都在同一磁盘上。我的Windows测试在使用默认设置的新安装上运行。非常感谢!我找了,但没找到!您是否将8.2 per database pgsql_tmp目录放置在比磁盘其余部分快10倍的位置?否。Linux机器的管理员将8.2 config复制到8.3并更改了端口和目录,但所有内容都在同一磁盘上。我的Windows测试使用默认设置进行新安装。