2009-07-09 2 views
0

내 응용 프로그램은 PostgreSQL에서 임시 테이블을 사용합니다. 새로운 8.4 릴리스에서 성능을 테스트 한 결과 을 이전 8.2 릴리스와 비교했을 때 임시 테이블 은 열 번째가 번 느립니다.8.3 이후 PostgreSQL TEMP TABLE 성능 저하가 발생 했습니까?

8.3 릴리스의 테스트는 8.3에서도 느린 것으로 나타났습니다. 모든 기지의 구성을 비교해 보면 비슷합니다. 모든 기지는 동일한 서버에서 작동합니다. 내 응용 프로그램은 JDBC 드라이버를 사용하는 동안 나는 그것을 테스트하기 위해 자이 썬 을 사용 :

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 테이블 동작의 변경 사항에 대한 정보가 있습니까?

편집

내가, 내 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이 변경 소개 :

2007년 6월 3일 13시 5분합니다 (commit log on the wiki에서하는) TGL하는 저장 임시 테이블에 테이블 스페이스 (들)을 선택할 수 있도록하는 GUC 매개 변수 temp_tablespaces 만들기 임시 파일. 이것은 여러 테이블 공간에로드를 분산시킬 수있는 목록입니다 (임의의 목록 요소는 임시 오브젝트가 작성 될 때마다 선택됩니다). 임시 파일은 데이터베이스 당 pgsql_tmp/ 디렉토리에 저장되지 않지만 테이블 공간 디렉토리에 저장됩니다.

Release notes 신용을 제공하는 "제이미 카사노바, 알버트 Cervera은, 베른트 Helmle는"


관련 될 수있는 pgsql-performance 목록에 보고서가있다. 원래 포스터 그러나 a post from Tom Lane 포함, 그 changing their kernel at the same time was more likely the cause 확인 :

"그래서 당신이 본 둔화가 8.3에서 카탈로그 업데이트의 더 큰 수를 만들기에서 오는 것으로 의심;" 8.2 설정이 8.3에 대한 복사 한


귀하의 의견은 ... 기본 자동 진공 설정이 OFF에서 ON으로 변경되었습니다. 어쩌면 임시 테이블이 8.3에서 제거되었지만 8.2에서는 제거되지 않았을 수 있습니까?

+0

고마워요! 나는 찾았다. 그러나 그것을 발견 할 수 없었다! –

+0

8.2 데이터베이스 당 pgsql_tmp 디렉토리를 나머지 디스크보다 10 배 더 빠르게 배치 했습니까? –

+0

아니요. Linux 컴퓨터의 관리자가 8.2 config를 8.3으로 복사하고 포트 및 디렉토리를 변경했지만 모든 것이 동일한 디스크에 복사됩니다. 내 Windows 테스트는 기본 설정으로 새로 설치했을 때 수행되었습니다. –

관련 문제