仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 836|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页编程之ORACLE SQL功能优化系列 (四)

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:38:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
平台即服务PaaS、基础设施即服务IaaS、软件即服务SaaS都是我们比较熟悉的MySQL学习教程,现在又出现了数据库即服务DBaaS,以基于云的方式存储结构化数据。oracle|功能|优化


13.盘算纪录条数

和一样平常的概念相反,count(*)比count(1)稍快,固然假如能够经由过程索引检索,对索引列的计数仍然是最快的.比方COUNT(EMPNO)



(译者按:在CSDN论坛中,已经对此有过相称强烈热闹的会商,作者的概念其实不非常正确,经由过程实践的测试,上述三种办法并没有明显的功能不同)



14.用Where子句交换HAVING子句



制止利用HAVING子句,HAVING只会在检索出一切纪录以后才对了局集举行过滤.这个处置必要排序,总计等操纵.假如能经由过程WHERE子句限定纪录的数量,那就可以削减这方面的开支.



比方:



低效:

SELECTREGION,AVG(LOG_SIZE)

FROMLOCATION

GROUPBYREGION

HAVINGREGIONREGION!=‘SYDNEY’

ANDREGION!=‘PERTH’



高效

SELECTREGION,AVG(LOG_SIZE)

FROMLOCATION

WHEREREGIONREGION!=‘SYDNEY’

ANDREGION!=‘PERTH’

GROUPBYREGION

(译者按:HAVING中的前提一样平常用于对一些汇合函数的对照,如COUNT()等等.除此而外,一样平常的前提应当写在WHERE子句中)



15.削减对表的查询

在含有子查询的SQL语句中,要出格注重削减对表的查询.



比方:

低效

SELECTTAB_NAME

FROMTABLES

WHERETAB_NAME=(SELECTTAB_NAME

FROMTAB_COLUMNS

WHEREVERSION=604)

AND DB_VER=(SELECTDB_VER

FROMTAB_COLUMNS

WHEREVERSION=604)



高效

SELECTTAB_NAME

FROMTABLES

WHERE(TAB_NAME,DB_VER)

=(SELECTTAB_NAME,DB_VER)

FROMTAB_COLUMNS

WHEREVERSION=604)



Update多个Column例子:

低效:

UPDATEEMP

SETEMP_CAT=(SELECTMAX(CATEGORY)FROMEMP_CATEGORIES),

SAL_RANGE=(SELECTMAX(SAL_RANGE)FROMEMP_CATEGORIES)

WHEREEMP_DEPT=0020;



高效:

UPDATEEMP

SET(EMP_CAT,SAL_RANGE)

=(SELECTMAX(CATEGORY),MAX(SAL_RANGE)

FROMEMP_CATEGORIES)

WHEREEMP_DEPT=0020;





16.经由过程外部函数进步SQL效力.



SELECTH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)

FROMHISTORY_TYPET,EMPE,EMP_HISTORYH

WHEREH.EMPNO=E.EMPNO

ANDH.HIST_TYPE=T.HIST_TYPE

GROUPBYH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;



经由过程挪用上面的函数能够进步效力.

FUNCTIONLOOKUP_HIST_TYPE(TYPINNUMBER)RETURNVARCHAR2

AS

TDESCVARCHAR2(30);

CURSORC1IS

SELECTTYPE_DESC

FROMHISTORY_TYPE

WHEREHIST_TYPE=TYP;

BEGIN

OPENC1;

FETCHC1INTOTDESC;

CLOSEC1;

RETURN(NVL(TDESC,’?’));

END;



FUNCTIONLOOKUP_EMP(EMPINNUMBER)RETURNVARCHAR2

AS

ENAMEVARCHAR2(30);

CURSORC1IS

SELECTENAME

FROMEMP

WHEREEMPNO=EMP;

BEGIN

OPENC1;

FETCHC1INTOENAME;

CLOSEC1;

RETURN(NVL(ENAME,’?’));

END;



SELECTH.EMPNO,LOOKUP_EMP(H.EMPNO),

H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)

FROMEMP_HISTORYH

GROUPBYH.EMPNO,H.HIST_TYPE;



(译者按:常常在论坛中看到如’能不克不及用一个SQL写出….’的贴子,却不知庞大的SQL常常就义了实行效力.可以把握下面的使用函数办理成绩的办法在实践事情中长短常成心义的)



(待续)
不管怎么样,市场的结果已经证明MySQL具有性价比高、灵活、MySQL学习教程广为使用和具有良好支持的特点。
山那边是海 该用户已被删除
沙发
发表于 2015-1-19 20:01:15 | 只看该作者
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
再现理想 该用户已被删除
板凳
发表于 2015-1-26 16:07:52 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
谁可相欹 该用户已被删除
地板
发表于 2015-2-4 18:16:29 | 只看该作者
总感觉自己还是不会SQL
若天明 该用户已被删除
5#
发表于 2015-2-10 05:15:20 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
再见西城 该用户已被删除
6#
发表于 2015-2-28 21:21:37 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
爱飞 该用户已被删除
7#
 楼主| 发表于 2015-3-10 08:08:48 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
深爱那片海 该用户已被删除
8#
发表于 2015-3-17 06:07:06 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
蒙在股里 该用户已被删除
9#
发表于 2015-3-23 22:31:46 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 11:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表