MYSQL网站制作之ORACLE SQL功能优化系列 (十一)
由于在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;
如果互联网服务提供商,支撑数据的云服务,或它们之间任一点网络被堵塞或中断,他们就会遇到与数据延迟或应用程序故障有关的问题。如果问题发生在企业内部,解决方案提供商可以排除故障找出原因。 需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~ 连做梦都在想页面结构是怎么样的,绝非虚言 多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜! 你可以简单地认为适合的就是好,不适合就是不好。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
页:
[1]