我试着运行一个简单的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之前完成?