|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL在业界的流行所带来的另一个好处是,人们总可以很轻松地发现本行业的MySQL学习教程。厂商都希望他们的开发工具和应用程序框架可以与MySQL数据库兼容。oracle|功能|优化
31.强迫索引生效
假如两个或以上索引具有不异的品级,你能够强迫命令ORACLE优化器利用个中的一个(经由过程它,检索出的纪录数目少).
举例:
SELECTENAME
FROMEMP
WHEREEMPNO=7935
ANDDEPTNO+0=10/*DEPTNO上的索引将生效*/
ANDEMP_TYPE||‘’=‘A’/*EMP_TYPE上的索引将生效*/
这是一种相称间接的进步查询效力的举措.可是你必需审慎思索这类战略,一样平常来讲,只要在你但愿独自优化几个SQL时才干接纳它.
这里有一个例子关于什么时候接纳这类战略,
假定在EMP表的EMP_TYPE列上有一个非独一性的索引而EMP_CLASS上没有索引.
SELECTENAME
FROMEMP
WHEREEMP_TYPE=‘A’
ANDEMP_CLASS=‘X’;
优化器会注重到EMP_TYPE上的索引并利用它.这是今朝独一的选择.假如,一段工夫今后,另外一个非独一性创建在EMP_CLASS上,优化器必需对两个索引举行选择,在一般情形下,优化器将利用两个索引并在他们的了局汇合上实行排序及兼并.但是,假如个中一个索引(EMP_TYPE)靠近于独一性而另外一个索引(EMP_CLASS)上有几千个反复的值.排序及兼并就会成为一种不用要的包袱.在这类情形下,你但愿使优化器屏障失落EMP_CLASS索引.
用上面的计划就能够办理成绩.
SELECTENAME
FROMEMP
WHEREEMP_TYPE=‘A’
ANDEMP_CLASS||’’=‘X’;
32.制止在索引列上利用盘算.
WHERE子句中,假如索引列是函数的一部分.优化器将不利用索引而利用全表扫描.
举例:
低效:
SELECT…
FROMDEPT
WHERESAL*12>25000;
高效:
SELECT…
FROMDEPT
WHERESAL>25000/12;
译者按:
这是一个十分有用的划定规矩,请务必切记
33.主动选择索引
假如表中有两个以上(包含两个)索引,个中有一个独一性索引,而其他长短独一性.
在这类情形下,ORACLE将利用独一性索引而完整疏忽非独一性索引.
举例:
SELECTENAME
FROMEMP
WHEREEMPNO=2326
ANDDEPTNO=20;
这里,只要EMPNO上的索引是独一性的,以是EMPNO索引将用来检索纪录.
TABLEACCESSBYROWIDONEMP
INDEXUNIQUESCANONEMP_NO_IDX
34.制止在索引列上利用NOT
一般, 我们要制止在索引列上利用NOT,NOT会发生在和在索引列上利用函数不异的
影响.当ORACLE”碰到”NOT,他就会中断利用索引转而实行全表扫描.
举例:
低效:(这里,不利用索引)
SELECT…
FROMDEPT
WHEREDEPT_CODENOT=0;
高效:(这里,利用了索引)
SELECT…
FROMDEPT
WHEREDEPT_CODE>0;
必要注重的是,在某些时分,ORACLE优化器会主动将NOT转化成绝对应的干系操纵符.
NOT>to<=
NOT>=to<
NOT<to>=
NOT<=to>
译者按:
在这个例子中,作者犯了一些毛病.例子中的低效力SQL是不克不及被实行的.
我做了一些测试:
SQL>select*fromempwhereNOTempno>1;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFEMP
21INDEX(RANGESCAN)OFEMPNO(UNIQUE)
SQL>select*fromempwhereempno<=1;
norowsselected
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFEMP
21INDEX(RANGESCAN)OFEMPNO(UNIQUE)
二者的效力完整一样,大概这切合作者关于”在某些时分,ORACLE优化器会主动将NOT转化成绝对应的干系操纵符”的概念.
35.用>=替换>
假如DEPTNO上有一个索引,
高效:
SELECT*
FROMEMP
WHEREDEPTNO>=4
低效:
SELECT*
FROMEMP
WHEREDEPTNO>3
二者的区分在于,前者DBMS将间接跳到第一个DEPT即是4的纪录尔后者将起首定位到DEPTNO=3的纪录而且向前扫描到第一个DEPT年夜于3的纪录.
只需每年花费2000到5000美元。无论你是自掏腰包来创建一个新兴公司,还是得到了风险投资商的赞助,使用MySQL都可以降低你所需要的人力成本。 |
|