为什么这个语句在 oracle 中的执行速度比 ms sql 慢得多

为什么这个语句在 oracle 中的执行速度比 ms sql 慢得多

我尝试运行一个简单的测试,以查看 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]

好像在加入之前没有进行过滤?

相关内容