马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
能够以较低的成本向客户提供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已被证明是一种适合于在各种情况下管理结构化数据的有效工具。 |