仓酷云

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

[学习教程] MYSQL网站制作之ORACLE SQL功能优化系列 (十一)

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

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

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

x
由于在MySQL中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。oracle|功能|优化
36.用UNION交换OR(合用于索引列)

一般情形下,用UNION交换WHERE子句中的OR将会起到较好的效果.对索引列利用OR将形成全表扫描.注重,以上划定规矩只针对多个索引列无效.假如有column没有被索引,查询效力大概会由于你没有选择OR而下降.

鄙人面的例子中,LOC_ID和REGION上都建有索引.

高效:

SELECTLOC_ID,LOC_DESC,REGION

FROMLOCATION

WHERELOC_ID=10

UNION

SELECTLOC_ID,LOC_DESC,REGION

FROMLOCATION

WHEREREGION=“MELBOURNE”



低效:

SELECTLOC_ID,LOC_DESC,REGION

FROMLOCATION

WHERELOC_ID=10ORREGION=“MELBOURNE”



假如你保持要用OR,那就必要前往纪录起码的索引列写在最后面.



注重:



WHEREKEY1=10(前往起码纪录)

ORKEY2=20(前往最多纪录)



ORACLE外部将以上转换为

WHEREKEY1=10AND

((NOTKEY1=10)ANDKEY2=20)



译者按:



上面的测试数据仅供参考:(a=1003前往一笔记录,b=1前往1003笔记录)

SQL>select*fromunionvsor/*1sttest*/

2wherea=1003orb=1;

1003rowsselected.

ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10CONCATENATION

21TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

32INDEX(RANGESCAN)OFUB(NON-UNIQUE)

41TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

54INDEX(RANGESCAN)OFUA(NON-UNIQUE)

Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

144consistentgets

0physicalreads

0redosize

63749bytessentviaSQL*Nettoclient

7751bytesreceivedviaSQL*Netfromclient

68SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

1003rowsprocessed

SQL>select*fromunionvsor/*2ndtest*/

2whereb=1ora=1003;

1003rowsselected.

ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10CONCATENATION

21TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

32INDEX(RANGESCAN)OFUA(NON-UNIQUE)

41TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

54INDEX(RANGESCAN)OFUB(NON-UNIQUE)

Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

143consistentgets

0physicalreads

0redosize

63749bytessentviaSQL*Nettoclient

7751bytesreceivedviaSQL*Netfromclient

68SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

1003rowsprocessed



SQL>select*fromunionvsor/*3rdtest*/

2wherea=1003

3union

4select*fromunionvsor

5whereb=1;

1003rowsselected.

ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10SORT(UNIQUE)

21UNION-ALL

32TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

43INDEX(RANGESCAN)OFUA(NON-UNIQUE)

52TABLEACCESS(BYINDEXROWID)OFUNIONVSOR

65INDEX(RANGESCAN)OFUB(NON-UNIQUE)

Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

10consistentgets

0physicalreads

0redosize

63735bytessentviaSQL*Nettoclient

7751bytesreceivedviaSQL*Netfromclient

68SQL*Netroundtripsto/fromclient

1sorts(memory)

0sorts(disk)

1003rowsprocessed

用UNION的效果能够从consistentgets和SQL*NET的数据互换量的削减看出



37.用IN来交换OR



上面的查询能够被更无效率的语句交换:



低效:



SELECT….

FROMLOCATION

WHERELOC_ID=10

ORLOC_ID=20

ORLOC_ID=30



高效

SELECT…

FROMLOCATION

WHERELOC_ININ(10,20,30);



译者按:

这是一条复杂易记的划定规矩,可是实践的实行效果还须查验,在ORACLE8i下,二者的实行路径仿佛是不异的. 





38.制止在索引列上利用ISNULL和ISNOTNULL

制止在索引中利用任何能够为空的列,ORACLE将没法利用该索引.关于单列索引,假如列包括空值,索引中将不存在此纪录.关于复合索引,假如每一个列都为空,索引中一样不存在此纪录. 假如最少有一个列不为空,则纪录存在于索引中.

举例:

假如独一性索引创建在表的A列和B列上,而且表中存在一笔记录的A,B值为(123,null),ORACLE将不承受下一条具有不异A,B值(123,null)的纪录(拔出).但是假如

一切的索引列都为空,ORACLE将以为全部键值为空而空不即是空.因而你能够拔出1000

条具有不异键值的纪录,固然它们都是空!



由于空值不存在于索引列中,以是WHERE子句中对索引列举行空值对照将使ORACLE停用该索引.

举例:



低效:(索引生效)

SELECT…

FROMDEPARTMENT

WHEREDEPT_CODEISNOTNULL;



高效:(索引无效)

SELECT…

FROMDEPARTMENT

WHEREDEPT_CODE>=0;


如果互联网服务提供商,支撑数据的云服务,或它们之间任一点网络被堵塞或中断,他们就会遇到与数据延迟或应用程序故障有关的问题。如果问题发生在企业内部,解决方案提供商可以排除故障找出原因。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-20 14:24:25 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-29 09:05:50 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
柔情似水 该用户已被删除
地板
发表于 2015-2-6 00:09:47 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
若相依 该用户已被删除
5#
发表于 2015-2-14 12:51:51 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
小魔女 该用户已被删除
6#
发表于 2015-3-4 06:34:46 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
莫相离 该用户已被删除
7#
 楼主| 发表于 2015-3-11 17:46:30 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
若天明 该用户已被删除
8#
发表于 2015-3-19 04:28:16 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 13:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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