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

我试着运行一个简单的testing,看看oracle和Ms Sql之间的速度是如何的如下:用两百万条logging填充两个表,交叉连接它们,过滤一个范围,然后做一笔总和。 作为同胞的两个表结构:

 创build表t(
logging编号,
名称,varchar(50),
 num数字//  - 随机
 ) 

SQL如下所示:

 select总和(a.record) 
从testing一个交叉连接testingb 
其中a.num在50001和80000之间,b.num在80001和110000之间 

不知何故,与sql相比,在oracle上运行的相同查询性能不佳。 在oracle上,时间大约在20s左右,但在Sql女士身上,结果会在1s内返回。 当我增加范围,oracle的时间降低,而sql仍然很好。

Oracle安装程序:红帽机器上的11g单实例Ms sql setup:2008在win7上

尝试关于oracles xe的声明,赢了7,结果也在20左右。 所有查询在单机上完成。

对oracle的声明应该写成不同的吗? 不知道有没有人可以提供一些见解?

谢谢

你确定你的索引正在被使用吗? EXPLAIN PLAN是如何告诉你有关索引的查询? 仅仅因为索引存在并不意味着Oracle会使用它。 如果统计信息未被build立/更新,则可能不使用该索引。

请参阅DBMS_STATS包,特别是GATHER_TABLE_STATS以获取更多信息。

一些简单的事情

BEGIN dbms_stats.gather_table_stats('<schema_owner>', 'TEST'); END; / 

可以解决你的问题。

请注意, '<schema_owner>'区分大小写。 否则,如果不这样做,它将是大写。

据推测,甲骨文打得不错,留在沙箱内,而MSSQL正在接pipe你的机器。 也就是说,MSSQL的工作几乎完全在RAM /caching之外,而Oracle则不得不打开磁盘。 尝试对两者都应用一些基本的优化,我敢打赌这个问题消失了。

你可以通过'Metalink'来问Oracle。 或者,如果您没有Metalink账户,那么潜在客户可能会问这样一个问题,特别是如果您有可能成为一个大用户。

性能是您selectDBMS时最重要的因素,您可能在生产中运行哪种工作负载? 您可能会发现硬件的select对性能的影响比DBMS的select更大。

这是运行gather_table_stats并解释计划之后的输出

 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; 

[IMG] http://i53.tinypic.com/262taol.jpg%5B/IMG%5D

好像没有filter在join之前完成?