加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server与Oracle数据库在查询优化上的差异(一)

发布时间:2016-09-07 10:13:22 所属栏目:MsSql教程 来源:站长网
导读:一般来说,Oracle数据库在大型数据环境下,其运行性能比SQL Server数据库效率要高。单从查询优化上讲,两者就有比较大的差异。下面,笔者将数据库查询优化的差
一般来说,Oracle数据库在大型数据环境下,其运行性能比SQL Server数据库效率要高。单从查询优化上讲,两者就有比较大的差异。下面,笔者将数据库查询优化的差异做一个描述,若有不准确的地方,还请大家批评指教。

一、 在数据库排序查询优化上的差异。

在讲解这个内容之前,为了读者能够清楚我讲的内容,我要先谈一个概念。命中率,它是指从内存中取得数据而不从磁盘中取得数据的比率。我们在前几篇文章中都提到过,当在数据库中查询数据时,数据库服务器都是先从内存中寻找数据。只有在内存中数据不存在的情况下,才会去读取数据库文件的内容。而且,从内存中查询数据要比在数据库文件中查询数据效率高得多。从这方面讲,我们若能够提高这个查询的命中率,则显然可以提高数据库系统的查询效率。

虽然SQL Server与Oracle在这方面都有所作为,但是,笔者认为,Oracle数据库在这方面的优势比较明显。特别是Oracle数据库采用了临时段的管理机制,明显提高了数据库查询的命中率。

那什么叫作数据库的临时段呢?假设当我们刚查完员工信息表后,此时,员工信息表的内容就存在数据库服务器的内存中。此时,我们需要对这个表进行排序查询,如我们希望查询出工龄超过两年的员工,并且按工龄的长短进行排序。此时,Oracle数据库服务器会设法在内存中排序区对所有行进行排序。而这个排序区的大小则有数据库的初始化文件init.ora进行确定。当这个排序区不够大,不能够容纳我们所查询出来的员工信息记录数时,数据库就会在排序操作期间,在数据库服务器中开辟临时段。很明显,在查询操作过程中,若开辟临时段的话,会减低数据库的命中率,降低排序查询的效率。我们现在希望这个排序能够在内存中完成,而不需要开辟额外的临时段,如此的话,就可以消除向临时段写数据的开销,提高排序查询的效率。所以,当我们数据库中的数据比较庞大时,我们可以考虑增加这个排序区的长度,以避免临时段的需要。正是这个临时段的问题,如我们刚查询完员工信息表,查询完成之后,再对该表进行排序查询,就觉得好像仍然是新的查询一样。其实,这个排序查询的问题,我们可以通过一定的方法对此进行优化,以提高排序查询的效率。

修改方法:

第一步:先利用查询语句判断,是否有临时段需求的产生。

select * from v$sysstat where name='dtmfg(disk)' or name='dtmfg(memory)';

如我们可以定时利用以上语句,来查询是否有临时段需求的产生。这条语句中,dtmfg是具体的数据库实例名,我们只需要修改这个名字,就可以查询到我们需要的内容。若在查询结果中,发现有临时段需求产生的话,则就需要考虑修改相关的配置文件,以优化排序查询性能。

第二步:修改参数配置文件。

我们需要修改inint.ora文件,修改里面的SORT-AREA-SIZE的值。不过,修改这个配置文件之后,还必须重新启动数据库才会生效。一般情况下,数据库管理员需要定时查询这个临时段需求,然后根据情况,不断的进行调整,做好数据排序查询优化功能。

而在微软的SQL Server数据库中,笔者没有发现类似的功能。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读