MYSQL编程:ORACLE SQL功能优化系列 (十三)
能够以较低的成本向客户提供IT所有权,当节约成本成为客户最高优先级时,解决方案提供商可以向更多的客户同时提供服务。虽然有许多来自RDBMS固有的局限性。oracle|功能|优化43.用WHERE替换ORDERBY
ORDERBY子句只在两种严厉的前提下利用索引.
ORDERBY中一切的列必需包括在不异的索引中并坚持在索引中的分列按次.
ORDERBY中一切的列必需界说为非空.
WHERE子句利用的索引和ORDERBY子句中所利用的索引不克不及并列.
比方:
表DEPT包括以以下:
DEPT_CODEPKNOTNULL
DEPT_DESCNOTNULL
DEPT_TYPENULL
非独一性的索引(DEPT_TYPE)
低效:(索引不被利用)
SELECTDEPT_CODE
FROMDEPT
ORDERBYDEPT_TYPE
EXPLAINPLAN:
SORTORDERBY
TABLEACCESSFULL
高效:(利用索引)
SELECTDEPT_CODE
FROMDEPT
WHEREDEPT_TYPE>0
EXPLAINPLAN:
TABLEACCESSBYROWIDONEMP
INDEXRANGESCANONDEPT_IDX
译者按:
ORDERBY也能利用索引!这切实其实是个简单被无视的常识点.我们来考证一下:
SQL>select*fromemporderbyempno;
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFEMP
21INDEX(FULLSCAN)OFEMPNO(UNIQUE)
44.制止改动索引列的范例.
当对照分歧数据范例的数据时,ORACLE主动对列举行复杂的范例转换.
假定EMPNO是一个数值范例的索引列.
SELECT…
FROMEMP
WHEREEMPNO=‘123’
实践上,经由ORACLE范例转换,语句转化为:
SELECT…
FROMEMP
WHEREEMPNO=TO_NUMBER(‘123’)
侥幸的是,范例转换没有产生在索引列上,索引的用处没有被改动.
如今,假定EMP_TYPE是一个字符范例的索引列.
SELECT…
FROMEMP
WHEREEMP_TYPE=123
这个语句被ORACLE转换为:
SELECT…
FROMEMP
WHERETO_NUMBER(EMP_TYPE)=123
由于外部产生的范例转换,这个索引将不会被用到!
译者按:
为了不ORACLE对你的SQL举行隐式的范例转换,最好把范例转换用显式体现出来.注重当字符和数值对照时,ORACLE会优先转换数值范例到字符范例.
45.必要小心的WHERE子句
某些SELECT语句中的WHERE子句不利用索引.这里有一些例子.
鄙人面的例子里,‘!=’将不利用索引.记着,索引只能告知你甚么存在于表中,而不克不及告知你甚么不存在于表中.
不利用索引:
SELECTACCOUNT_NAME
FROMTRANSACTION
WHEREAMOUNT!=0;
利用索引:
SELECTACCOUNT_NAME
FROMTRANSACTION
WHEREAMOUNT>0;
上面的例子中,‘||’是字符毗连函数.就象其他函数那样,停用了索引.
不利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;
利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREACCOUNT_NAME=‘AMEX’
ANDACCOUNT_TYPE=’A’;
上面的例子中,‘+’是数学函数.就象其他数学函数那样,停用了索引.
不利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREAMOUNT+3000>5000;
利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREAMOUNT>2000;
上面的例子中,不异的索引列不克不及相互对照,这将会启用全表扫描.
不利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREACCOUNT_NAME=NVL(:ACC_NAME,ACCOUNT_NAME);
利用索引:
SELECTACCOUNT_NAME,AMOUNT
FROMTRANSACTION
WHEREACCOUNT_NAMELIKENVL(:ACC_NAME,’%’);
译者按:
假如必定要对利用函数的列启用索引,ORACLE新的功效:基于函数的索引(Function-BasedIndex)大概是一个较好的计划.
CREATEINDEXEMP_IONEMP(UPPER(ename));/*创建基于函数的索引*/
SELECT*FROMempWHEREUPPER(ename)=‘BLACKSNAIL’;/*将利用索引*/
DBaaS和其他云服务之间的区别是:DBaaS专注于提供类似关系数据库管理系统RDBMS(比如SQLServer、MySQL和Oracle)的数据库功能。事实上,RDBMS已被证明是一种适合于在各种情况下管理结构化数据的有效工具。 在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。 从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。 始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
页:
[1]