【发布时间】:2014-09-27 09:27:07
【问题描述】:
我们正在尝试了解 Oracle 与 PostgreSQL 的原始性能。我们有丰富的 oracle 经验,但对 PostgreSQL 不熟悉。我们将使用我们的数据等运行大量查询。但首先我们想看看它们在基本内核任务上的执行情况,即数学和分支,因为 SQL 是建立在此之上的。
在 AWS RDS 中,我们创建了两个 db.m3.2xlarge 实例,一个包含 oracle 11.2.0.4.v1 许可证,另一个包含 PostgreSQL (9.3.3)
在这两种情况下,我们运行的代码都计算了 100 万平方根(从 1 到 1 磨)。 Then 做了同样的事情,但在 If..Then 语句中。
结果有点令人不安:
Oracle 4.8 seconds
PostgreSQL 21.803 seconds
添加 if 语句:
Oracle 4.78 seconds
PostgreSQL 24.4 seconds
代码 甲骨文平方根
SET SERVEROUTPUT ON
SET TIMING ON
DECLARE
n NUMBER := 0;
BEGIN
FOR f IN 1..10000000
LOOP
n := SQRT (f);
END LOOP;
END;
PostgreSQL
DO LANGUAGE plpgsql $$ DECLARE n real;
BEGIN
FOR f IN 1..10000000 LOOP
n = SQRT (f);
END LOOP;
RAISE NOTICE 'Result => %',n;
END $$;
oracle 添加 if
SET SERVEROUTPUT ON
SET TIMING ON
DECLARE
n NUMBER := 0;
BEGIN
FOR f IN 1..10000000
LOOP
if 0 =0 then
n := SQRT (f);
end if;
END LOOP;
postgres 添加 if
DO LANGUAGE plpgsql $$ DECLARE n real;
BEGIN
FOR f IN 1..10000000 LOOP
if 0=0 then
n = SQRT (f);
end if;
END LOOP;
RAISE NOTICE 'Result => %',n;
END $$;
我为 PostgreSQL 使用了一个匿名块。我也把它作为一个函数来做,得到了相同的结果
CREATE OR REPLACE FUNCTION testpostgrescpu()
RETURNS real AS
$BODY$
declare
n real;
BEGIN
FOR f IN 1..10000000 LOOP
n = SQRT (f);
END LOOP;
RETURN n;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION testpostgrescpu()
OWNER TO xxx
根据我们对 PostgreSQL 的了解以及它在许多方面与 Oracle 的可比性,我们对结果感到吃惊。我们对 PostgreSQL 的编码是否错误?我们缺少什么,或者它是这样的。
注意:一旦我们开始在 Oracle 和 PostgreSQL 中对完全相同的数据运行查询,我们就会看到类似的模式。在基本查询方面差别不大,但随着它们开始变得越来越复杂,Oracle 的速度提高了大约 3-5 倍。
同样,这是在相同的 AWS RDS 实例上运行的,我们在一天中的不同日子多次运行它们,结果始终相同
【问题讨论】:
-
Oracle实例有可能是多线程的吗?我真的想知道默认系统参数是否对 Oracle 实例更有效(这可能不会影响循环,但会影响其他操作)。
-
它不像PostgreSQL那样多线程它的多进程Oracle可以运行多线程但很少这样使用
标签: sql database oracle postgresql amazon-web-services