在Fedora 17上使用PostgreSQL的默认设置缓慢INSERT和DELETE

Pri*_*mre 2 postgresql fedora jdbc

(我会尝试简要介绍一下我正在尝试实现的内容,然后描述我面临的问题)

目标

好的,所以我在PostgreSQL中通过JDBC进行语句执行时的基本基准测试.我目前正在测试的案例如下:

实验#1:在订单表中插入5000个订单.存储每个INSERT的绝对执行时间并计算平均值.SQL类似于:

INSERT INTO Order(order_ID, order_state_R_ID, customer_ID, submission_time, 
acceptance_time, completion_time, additional_info) VALUES (?, ?, ?, ?, ?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

实验#2:从订单表中选择订单5000次.存储每个SELECT的绝对执行时间并计算平均值.因此,基本上在上一个实验中插入的每一行都是逐个读取的,以便大致了解它需要多长时间.对应的SQL:

SELECT * FROM Order WHERE order_ID = ?;
Run Code Online (Sandbox Code Playgroud)

实验#3:删除在实验#1期间插入的每个订单(再次,一个一个).存储每个DELETE的绝对执行时间并计算平均值.

DELETE FROM Order WHERE order_ID = ?;
Run Code Online (Sandbox Code Playgroud)

问题

起初我在Windows 7上运行这些实验(默认安装PostgreSQL 9.2).我得到的平均值如下:(#1:1.5 ms),(#2:0.4 ms),(#3:1.9 ms).

现在,为了更好地了解与专门在Linux上运行的另一个DBMS相比的速度,我在Fedora 17(相同的PC,不同的逻辑分区)中重建了整个环境并再次运行测试.我的问题是,由于一些奇怪的原因,现在结果更像(#1:15 ms),(#2:0.2 ms),(#3:15 ms).这意味着SELECT略快,但INSERT和DELETE比Windows慢得多.两种情况下数据库都相同.此外,运行ANALYZE或VACUUM FULL似乎没有任何区别.

我确实意识到这里有很多开放的目标.但是,我想知道是否有人遇到过类似的情况,或者有关于瓶颈可能位置的任何提示?

澄清一下:我的目标不是探索PostgreSQL的任何类型的事务吞吐量功能,而是要找出上述语句的绝对执行时间.因此,每个实验中的每个语句都是使用单个数据库连接在一个线程上串行执行的.

Jak*_*nia 5

像Ext4这样的日志文件系统可以减慢pg,因为它正在等待数据写入磁盘.有关更多信息,请参阅:http://wiki.postgresql.org/wiki/Reliable_Writes.您可以尝试使用以下命令关闭同步:

SET LOCAL synchronous_commit TO OFF;
Run Code Online (Sandbox Code Playgroud)

或者更改文件系统.

  • 神圣的废话这是迁移大型数据库时的差异.疯. (2认同)