- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们正在尝试了解 Oracle 与 PostgreSQL 的原始性能。我们拥有丰富的 Oracle 经验,但对 PostgreSQL 还是陌生的。我们将对我们的数据等运行大量查询。但首先我们想看看它们如何执行基本的内核任务,即数学和分支,因为 SQL 是建立在这些任务上的。
在 AWS RDS 中,我们创建了两个 db.m3.2xlarge 实例,一个包含 oracle 11.2.0.4.v1 许可证,另一个包含 PostgreSQL (9.3.3)
在两者中,我们都运行了执行 100 万平方根(从 1 到 1 mill)的代码。然后在 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 $$;
甲骨文添加如果
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 使用了一个匿名 block 。我也把它作为一个函数来做,并得到了相同的结果
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 在此类计算上比 Postgres 慢。但是,我认为您的性能问题可能在 documentation 中。 :
The type numeric can store numbers with a very large number of digits and perform calculations exactly. It is especially recommended for storing monetary amounts and other quantities where exactness is required. However, arithmetic on numeric values is very slow compared to the integer types, or to the floating-point types described in the next section.
您的代码没有为 f
声明数据类型。根据上下文,它将被分配为一个整数。但是,sqrt()
函数采用 float 或 numeric
常量。这些是不等价的(我猜当 numeric
时,函数速度较慢)。我的猜测是整数 f
被转换为 number
而不是操作的 real
。
尝试通过显式声明 f
为 real
或在函数调用之前强制转换它来运行测试。这可能会提高性能。
关于sql - Postgres vs oracle 做 100 万 sqrts 我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126592/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!