2009-07-09 15 views
0

私のアプリはPostgreSQLで一時テーブルを使用しています。 新しい8.4リリースで私はパフォーマンスをテストしました。 と古い8.2リリースを比較したところ、テンポラリテーブル は, times slowerです!8.3以降、PostgreSQLのTEMP TABLEのパフォーマンスが低下していますか?

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のリリースで一時テーブルの速度の同じ劣化を観察するのですか? TEMPテーブルの動作の変更に関する情報はありますか?

EDIT

私は、私のWindowsマシン上でのPostgreSQL 8.2と8.4をインストール10 000を挿入して、それをテストし、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 

答えて

1

私はそれをチェックします - しかし私はあなたの結果を繰り返すことはできません。私のコンピュータでは、テーブルへの挿入の速度は、私がテストしたすべてのバージョンで似ています。それはいくつかの奇妙なので、8.2.12にあなたの広告に10倍の挿入は、通常のテーブルに挿入するより速いです。私のコンピュータ上の一時テーブルへの挿入は、通常のテーブルへの挿入よりも約1.5〜2倍高速です。

+0

テストいただきありがとうございます。私は他のマシンで私のテストを繰り返します。 –

+0

Windowsマシンで新しくインストールしてテストしましたが、クエリに追加したときには、8.4の正規表と一時表の間にほとんど違いはありませんでしたが、8.2の一時表ははるかに高速でした。 –

3

8.3はこの変更を導入:TGL

2007-06-03 13:05

commit log on the wikiから)は表領域(単数または複数)の選択を可能にするGUCパラメータ temp_tablespacesを作成し、一時テーブルを格納するためにどのおよび一時ファイル。これは、複数の表領域に負荷を分散させるためのリストです(一時オブジェクトを作成するたびにランダムなリスト要素が選択されます)。一時ファイルは、データベースごとに pgsql_tmp/ディレクトリには格納されませんが、表スペースごとのディレクトリには格納されません。

Release notes関連するかもしれないpgsql-performanceリストへの報告があり、「ハイメ・カサノバ、アルバート・セルベラ、ベルント・Helmle」


に信用を与えます。オリジナルポスターは、しかしa post from Tom Laneは含まれ、そのchanging their kernel at the same time was more likely the cause識別:

「だから私はあなたが見た減速が8.3でカタログの更新の より多くを行うことから来ていると思われます。」


8.2設定が8.3のためにコピーされたことをコメント...デフォルトの自動バキュームの設定がオフからオンに変更しました。多分あなたの一時テーブルは8.3で掃除されましたが、8.2では掃除されていませんでしたか?

+0

ありがとう!私は検索しましたが、それを見つけることができませんでした! –

+0

8.2データベースごとのpgsql_tmpディレクトリをディスクの残りの10倍のどこかに置いていたのでしょうか? –

+0

いいえ、Linuxマシンの管理者が8.2の設定を8.3にコピーし、ポートとディレクトリを変更しましたが、すべてが同じディスクにあります。私のWindowsテストは、デフォルト設定で新しくインストールされました。 –

関連する問題