Наблюдаете ли вы снижение производительности PostgreSQL TEMP TABLE с версии 8.3? - PullRequest
0 голосов
/ 09 июля 2009

Мое приложение использует временные таблицы в 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 и 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

Ответы [ 2 ]

3 голосов
/ 10 июля 2009

8.3 ввел это изменение: (из журнала коммитов в вики )

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

Примечания к выпуску отдают должное "Jaime Casanova, Albert Cervera, Bernd Helmle"


В список pgsql-performance имеется отчет, который может быть связан. Оригинальный плакат идентифицировал, что изменение их ядра в то же самое время было более вероятной причиной , однако сообщение от Тома Лейна включает:

"Так что я подозреваю, что замедление, которое вы видели, связано с большее количество обновлений каталога в 8.3; "


Ваш комментарий, что конфигурация 8.2 была скопирована для 8.3 ... настройка автоочистки по умолчанию изменена с выключенного на включенный. Может быть, ваши временные таблицы пылесосятся в 8.3, а не в 8.2?

1 голос
/ 10 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...