我尝试运行一个简单的测试,以查看 Oracle 和 MS SQL 之间的速度差异,如下所示:在两个表中填充 200 万条记录,交叉连接它们,按范围过滤,然后求和。两个表的结构如下:
创建表 t ( 记录编号, 名称,varchar(50), num 数字 //--随机 )
SQL 为:
选择总和(a.记录) 从测试 a 交叉连接测试 b 其中 a.num 介于 50001 和 80000 之间,b.num 介于 80001 和 110000 之间
不知何故,与 Ms SQL 相比,在 Oracle 上运行的相同查询性能较差。在 Oracle 上,时间约为 20 秒,但在 Ms SQL 上,结果在 1 秒内返回。随着我增加范围,Oracle 上的时间变慢了,而 SQL 仍然很好。
Oracle 设置:Red Hat 计算机上的 11g 单实例 MS SQL 设置:Win7 上的 2008
在 oracles xe、win 7 上尝试该语句,结果也在 20 秒左右。所有查询都在单台机器上完成。
oracle 上的语句应该改写吗?不知道有谁能提供一些见解?
谢谢
答案1
您确定您的索引正在被使用吗?EXPLAIN PLAN 告诉您有关索引的查询的什么信息?仅仅因为索引存在并不意味着 Oracle 会使用它。如果未建立/更新统计信息,则可能不会使用该索引。
查看数据库管理系统统计信息包,特别是收集表统计信息了解更多信息。
简单来说
BEGIN
dbms_stats.gather_table_stats('<schema_owner>', 'TEST');
END;
/
可以解决你的问题。
请注意'<schema_owner>'
区分大小写。除非您特意将其改为大写,否则它将是大写的。
答案2
可以推测,Oracle 运行良好,并留在其沙盒中,而 MSSQL 则接管了您的计算机。也就是说,MSSQL 几乎完全依靠 RAM/缓存工作,而 Oracle 则必须访问磁盘。尝试对两者应用一些基本的优化,我敢打赌问题会消失。
答案3
您可以通过“Metalink”询问 Oracle。或者,如果您没有 Metalink 帐户,潜在客户大概可以通过某种方式询问此类问题,特别是如果您有可能成为大用户的话。
在选择 DBMS 时,性能是否是您最重要的因素?您在生产中可能运行哪种类型的工作负载?您可能会发现硬件的选择对性能的影响比 DBMS 的选择更大。
答案4
以下是运行 gather_table_stats 和 explain plan 后的输出
SQL> BEGIN
2 dbms_stats.gather_table_stats('hr', 'TEST');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>explain plan for select count(*) from hr.test a join hr.test b
on a.noofrecord between 50001 and 60000 and b.noofrecord between 80001 and 90000;
[图片]http://i53.tinypic.com/262taol.jpg[/IMG]
好像在加入之前没有进行过滤?