为什么在我的测试中PostgreSQL 9.2比9.1慢?

为什么在我的测试中PostgreSQL 9.2比9.1慢?,postgresql,benchmarking,Postgresql,Benchmarking,我已从PostgreSQL 9.1.5升级到9.2.1: "PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit" "PostgreSQL 9.2.1 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit"

我已从PostgreSQL 9.1.5升级到9.2.1:

"PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit"
"PostgreSQL 9.2.1 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit"

它与默认的PostgreSQL配置文件位于同一台计算机上(仅更改了端口)

出于测试目的,我有一个简单的表:

CREATE TEMP TABLE test_table_md_speed(id serial primary key, n integer);
我使用以下函数对其进行测试:

CREATE OR REPLACE FUNCTION TEST_DB_SPEED(cnt integer) RETURNS text AS $$
DECLARE
    time_start timestamp;
    time_stop timestamp;
    time_total interval;
BEGIN
    time_start := cast(timeofday() AS TIMESTAMP);
    FOR i IN 1..cnt LOOP
        INSERT INTO test_table_md_speed(n) VALUES (i);
    END LOOP;
    time_stop := cast(timeofday() AS TIMESTAMP);
    time_total := time_stop-time_start;

    RETURN extract (milliseconds from time_total);
END;
$$ LANGUAGE plpgsql;
我呼吁:

SELECT test_db_speed(1000000);
我看到奇怪的结果。对于PostgreSQL 9.1.5,我得到了“8254.769”,对于9.2.1,我得到了“9022.219”。这意味着新版本速度较慢。我不知道为什么


你知道为什么这些结果不同吗?

你说两者都在同一台机器上。新版本的数据文件可能是后来添加的。稍后的文件倾向于添加到更靠近盘片中心的位置,在那里访问速度较慢

在中有一个很好的章节,包括测量和绘制效果的方法。通过巧妙地使用
dd
实用程序,您可能能够对每个位置的相对速度进行一些特别测试,至少对于读取

与早期版本相比,9.2版本通常可以更好地扩展到大量核心,尽管在一些基准测试中,单独运行单个查询的性能略有下降。不过,在这么大的范围内,我没有看到任何基准测试显示出效果;我敢打赌,这是在驱动器上的位置的结果——这只是为了表明做好基准测试有多么困难



更新:在9.2.0中为提高某些查询的性能而进行的更改使其他一些查询的性能更差。最终确定应恢复此更改,这发生在版本9.2.3中;因此,在升级到该维护版本后,值得检查性能。9.3.0中将包含一个正确的修复程序,该程序已被确认可以修复修复的问题恢复补丁不会导致回归。我也在没有
id SERIAL
列的情况下对其进行了测试,结果非常相似:9.2比9.1慢。这几乎不是一个合理的性能测试。我知道。这是更大测试的一部分。在9.2版本中速度较慢,我将其缩减为不同的部分。“使用默认PostgreSQL配置文件”这些测试有什么意义?对于生产负载来说,默认配置几乎是无用的,这并不意味着9.1在测试中可能比9.2快。这样的结果首先是在与默认配置不同的生产环境中观察到的。然后,我将测试剪切到呈现的表单,并在我的一个测试环境中使用默认配置对其进行测试。这很容易测试。我认为PostgreSQL二进制文件中发生了一些变化,而不是配置,但我找不到这种变化。如果在9.2的默认配置中更改了某些内容,那么我的结果当然会出错(受这种更改的影响),但我也看不到这种更改。我使用了临时表,所以它应该在内存中。没有TEMP时,结果更差,但9.1优于9.2。测试也在一个接一个安装的“clean”数据库(initdb和“postgres”数据库中的测试)上进行。