代码之家  ›  专栏  ›  技术社区  ›  Michał Niklas

您是否观察到PostgreSQL临时表自8.3以来的性能下降?

  •  0
  • Michał Niklas  · 技术社区  · 17 年前

    我的应用程序在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')
    

    我还使用activepython和来自win32的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
    
    2 回复  |  直到 17 年前
        1
  •  3
  •   Stephen Denne    16 年前

    8.3介绍了这一变化:(从 commit log on the wiki )

    2007-06-03 13:05 tgl创建一个guc参数 temp_tablespaces 它允许选择存储临时表和临时文件的表空间。这是一个列表,允许在多个表空间中分散负载(每次创建临时对象时都会选择一个随机列表元素)。临时文件未存储在每个数据库中 pgsql_tmp/ 目录,但按表空间目录。

    Release notes 赞扬“杰米·卡萨诺娃,阿尔伯特·塞维拉,伯纳德·赫尔姆”


    有一份报告给 pgsql-performance 可能相关的列表。最初的海报表明 changing their kernel at the same time was more likely the cause 然而 a post from Tom Lane 包括:

    “所以我怀疑你看到的减速来自于 在8.3中有更多的目录更新;


    你说8.2配置是为8.3复制的…默认的自动真空设置从“关”更改为“开”。也许你的临时桌是在8.3里被抽真空的,但不是在8.2里?

        2
  •  1
  •   Pavel Stehule    17 年前

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