本人很喜欢Oracle,在工作中也很喜欢总结关于Oracle SQL语句的经验教训,下面就这个问题来详细说说吧。数据库管理员还可以通过下述语句查看低效率的Oracle SQL语句,优化这些语句也有助于提高CPU的利用率。
查看数据库的冲突情况
数据库管理员可以通过V$SYSTEM_EVENT数据字典中的“latch free”统计项查看Oracle数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。
Oracle SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现。但是语句的执行效率是很不相同的,程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写Oracle SQL语句需要满足考虑如下规则:
(1)尽量使用索引。试比较下面两条Oracle SQL语句:
◆ Oracle SQL语句A
◆ Oracle SQL语句B
这两条查询语句实现的结果是相同的,但是执行语句A的时候,Oracle会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引;执行语句 B的时候,由于在子查询中使用了联合查询,Oracle只是对emp表进行的部分数据扫描,并利用了deptno列的索引。所以,语句B的效率要比语句A 的效率高一些。
(2)选择联合查询的联合次序。
(3)在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多。
(4)慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。
(5)可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。
(6)Oracle公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。
至此,我们完成了对Oracle数据库的优化。Oracle数据库的性能优化调整是一个系统工程,涉及的方面很多。数据库管理员需要综合运用上面介绍的优化方法和规律,认真分析Oracle运行过程当中出现的各种问题,合理优化,才能保证Oracle数据库高效地运行。
【编辑推荐】
帮忙解读个SQL语句 LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
这不是SQL语句,是Oracle SQL*Loader工具的控制文件的内容,意思是使用作为输入文件,将数据加载到_table这个表中。

懂SQL语言与SAS的大侠进
SAS是数据仓库的一种,主要应用于大量数据处理,数据分析等。 可以说应用并不是很广泛的,但是数据仓库的理念不错,而且前景看起来也还不错。 只要找到了适合的工作,一般都会不错,只是这样的工作不太好找。 SQL语言主要就是现在很流行的数据库的语言了,应用很广泛,能应用一些SQL编程已经是现在程序员的基础了,所以说实际工作中,应该是SQL更有用一些的。 另外,“经常看见有企业说熟练运用SAS”,这个似乎不是很贴切,在一些2线城市,似乎用到SAS的很少很少,我当时找工作的时候也很是痛苦了一阵子呢。
SQL查询中in和exists的区别分析
IN确定给定的值是否与子查询或列表中的值相匹配。 EXISTS指定一个子查询,检测行的存在。 比较使用EXISTS和IN的查询这个例子比较了两个语义类似的查询。 第一个查询使用EXISTS而第二个查询使用IN。 注意两个查询返回相同的信息。 USEpubsGOSELECTDISTINCTpub_nameFrompublishersWHEREEXISTS(SELECT*FROMtitlesWHEREpub_id=_iDanDtype=business)GO--Or,usingtheINclause:USEpubsGOSELECTdistinctpub_nameFROMpublishersWHEREpub_idIN(SELECTpub_idFROMtitlesWHEREtype=business)GO下面是任一查询的结果集:pub_name----------------------------------------AlgodataInfosystemsNewMoonBooks(2row(s)affected)exits相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如existP表示P不空时为真;notexistP表示p为空时为真in表示一个标量和一元关系的关系。 例如:sinP表示当s与P中的某个值相等时为真;snotinP表示s与P中的每一个值都不相等时为真转载自在OracleSQL中取数据时有时要用到in和exists那么他们有什么区别呢?1性能上的比较比如Select*fromT1wherexin(selectyfromT2)执行的过程相当于:select*fromt1,(selectdistinctyfromt2)t2wheret1.x=t2.y;相对的select*fromt1whereexists(selectnullfromt2wherey=x)执行的过程相当于:forxin(select*fromt1)loopif(exists(selectnullfromt2wherey=x.x)thenOUTPUTTHERECORDendifendloop表T1不可避免的要被完全扫描一遍分别适用在什么情况?以子查询(selectyfromT2)为考虑方向如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行(selectnullfromt2wherey=x.x)非常快,那么exists就比较适合用在这里相对应得子查询的结果集比较小的时候就应该使用in.转载自和existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。 一直以来认为exists比in效率高的说法是不准确的。 如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select*fromAwhereccin(selectccfromB)效率低,用到了A表上cc列的索引;select*fromAwhereexists(selectccfromBwherecc=)效率高,用到了B表上cc列的索引。 相反的2:select*fromBwhereccin(selectccfromA)效率高,用到了B表上cc列的索引;select*fromBwhereexists(selectccfromAwherecc=)效率低,用到了A表上cc列的索引。 notin和notexists如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。 所以无论那个表大,用notexists都比notin要快。 in与=的区别selectnamefromstudentwherenamein(zhang,wang,li,zhao);与selectnamefromstudentwherename=zhangorname=liorname=wangorname=zhao的结果是相同的。
发表评论