仓酷云

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

[学习教程] MYSQL编程:ORACLE SQL功能优化系列 (十三)

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

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

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

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已被证明是一种适合于在各种情况下管理结构化数据的有效工具。
飘灵儿 该用户已被删除
沙发
发表于 2015-1-19 21:04:06 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
简单生活 该用户已被删除
板凳
发表于 2015-1-25 18:12:21 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-3 12:42:58 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
不帅 该用户已被删除
5#
发表于 2015-2-9 00:51:33 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-26 16:04:39 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
若相依 该用户已被删除
7#
发表于 2015-3-8 16:01:52 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
老尸 该用户已被删除
8#
发表于 2015-3-16 04:00:58 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
乐观 该用户已被删除
9#
发表于 2015-3-22 20:08:11 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
若天明 该用户已被删除
10#
发表于 2015-3-22 20:08:12 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 19:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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