|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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;
如果互联网服务提供商,支撑数据的云服务,或它们之间任一点网络被堵塞或中断,他们就会遇到与数据延迟或应用程序故障有关的问题。如果问题发生在企业内部,解决方案提供商可以排除故障找出原因。 |
|