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

标签 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 配置文件在同一台机器上(只是更改了端口)。

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

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”。这意味着新版本速度较慢。我找不到原因。

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

最佳答案

你说两者都在同一台机器上。据推测,较新版本的数据文件是后来添加的。较晚的文件往往被添加到靠近盘片中心的位置,那里的访问速度较慢。

Greg Smith's book on PostgreSQL performance 中有一个很好的部分。 ,包括测量和绘制效果图的方法。通过巧妙地使用 dd 实用程序,您可以对每个位置的相对速度进行一些临时测试,至少对于读取而言。

虽然在某些基准测试中,单独运行的单个查询的性能略有下降,但 9.2 版本通常比早期版本更好地扩展到大量内核。不过,我没有看到任何基准显示出如此大的影响;我敢打赌这是驱动器位置的结果——这只是为了展示做好基准测试有多么困难。


更新:9.2.0 中为提高某些查询的性能所做的更改使其他一些查询的性能更差。最终确定应该恢复此更改,这发生在版本 9.2.3 中;因此值得在升级到该维护版本后检查性能。 9.3.0 中将包含一个适当的修复程序,该修复程序已被确认可以修复已恢复的补丁程序修复的问题而不会导致回归。

关于postgresql - 为什么在我的测试中 PostgreSQL 9.2 比 9.1 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622406/

相关文章:

sql - 缺少列结果(应该很容易修复)

database - 具有静态加密和审计功能的开源数据库

c++ - QTest执行两次测试用例

php - 在 Zend Framework 中查找执行时间的最佳实践方法

c - 基准测试、顺序 x 并行程序。亚线性加速?

mysql - 将 Sonarqube 6.5 升级到 7.1,并从旧服务器和数据库迁移

postgresql - 使用 --schema 参数将 Sqoop 导出到 postgres

java - 具有偏移和限制的 0..n 结果转换会产生不准确的结果

java - Fast MD5 Library 是不是比 Java 7 MD5 更快?

mysql - 在 mysql vs cassandra 中插入速度