2009-07-09 2 views
0

Мое приложение использует временные таблицы в PostgreSQL. С новым выпуском 8,4 я тестировал его производительность по сравнению с до старого выпуска 8.2, и я заметил, что временные таблицы : десять раз медленнее!Вы наблюдаете ухудшение производительности PostgreSQL TEMP TABLE с 8,3?

Испытание версии 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 и ODBC из win32, и эта программа показывает те же результаты. Мои результаты:

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

Я установил PostgreSQL 8.2 и 8.4 на моей машине Windows, протестировали его с 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

Я проверил - но я не могу повторить ваши результаты. На моем компьютере скорость вставки в таблицу temp аналогична для всех версий, которые я тестировал. Это странно, поэтому вставка на 8.2.12 на вашем компьютере в 10 раз быстрее, чем вставка в обычную таблицу. На моем компьютере вставка в таблицу temp примерно в 1,5-2 раза быстрее, чем вставка в обычную таблицу.

+0

Спасибо за тестирование. Я повторю свой тест на другой машине. –

+0

Я тестировал его на своей машине Windows со свежими установками, и, как я добавил в запросе, практически нет разницы между регулярными и временными таблицами на 8.4, в то время как 8.2 temp-таблицы намного быстрее. –

3

8.3 введен это изменение: (С commit log on the wiki)

2007-06-03 13:05 TGL Создать параметр GUC temp_tablespaces, что позволяет выбирать табличные (ов), в котором для хранения временных таблиц и временные файлы. Это список, который позволяет распространять нагрузку на несколько табличных пространств (случайный элемент списка выбирается каждый раз, когда создается временный объект). Файлы Temp больше не хранятся в каталогах данных pgsql_tmp/, а в каталогах для таблиц.

Release notes отдать "Хайме Казановы, Альберт Cervera, Бернд Helmle"


Существует доклад в 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?

+0

Спасибо большое! Я искал, но не смог найти его! –

+0

Если бы вы разместили свой каталог pgsql_tmp по каждой базе данных в 10 раз быстрее, чем остальная часть вашего диска? –

+0

№ Администратор Linux-машины скопировал 8.2 config на 8.3 и изменил порт и каталоги, но все на одном диске. Мои тесты Windows работали над новыми установками с настройками по умолчанию. –

Смежные вопросы