|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
DBaaS会导致单一客户利润率的下降,因为云服务一般是依靠MySQL学习教程数来抵消较低的利润率。oracle|功能|优化
39.老是利用索引的第一个列
假如索引是创建在多个列上,只要在它的第一个列(leadingcolumn)被where子句援用时,优化器才会选择利用该索引.
译者按:
这也是一条复杂而主要的划定规矩.见以下实例.
SQL>createtablemultiindexusage(indanumber,indbnumber,descrvarchar2(10));
Tablecreated.
SQL>createindexmultindexonmultiindexusage(inda,indb);
Indexcreated.
SQL>setautotracetraceonly
SQL>select*frommultiindexusagewhereinda=1;
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(BYINDEXROWID)OFMULTIINDEXUSAGE
21INDEX(RANGESCAN)OFMULTINDEX(NON-UNIQUE)
SQL>select*frommultiindexusagewhereindb=1;
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFMULTIINDEXUSAGE
很分明,当仅援用索引的第二个列时,优化器利用了全表扫描而疏忽了索引
40.ORACLE外部操纵
当实行查询时,ORACLE接纳了外部的操纵.下表显现了几种主要的外部操纵.
ORACLEClause
外部操纵
ORDERBY
SORTORDERBY
UNION
UNION-ALL
MINUS
MINUS
INTERSECT
INTERSECT
DISTINCT,MINUS,INTERSECT,UNION
SORTUNIQUE
MIN,MAX,COUNT
SORTAGGREGATE
GROUPBY
SORTGROUPBY
ROWNUM
COUNTorCOUNTSTOPKEY
QueriesinvolvingJoins
SORTJOIN,MERGEJOIN,NESTEDLOOPS
CONNECTBY
CONNECTBY
41.用UNION-ALL交换UNION(假如有大概的话)
当SQL语句必要UNION两个查询了局汇合时,这两个了局汇合会以UNION-ALL的体例被兼并,然后在输入终极了局行进行排序.
假如用UNIONALL替换UNION,如许排序就不是需要了.效力就会因而失掉进步.
举例:
低效:
SELECTACCT_NUM,BALANCE_AMT
FROMDEBIT_TRANSACTIONS
WHERETRAN_DATE=’31-DEC-95’
UNION
SELECTACCT_NUM,BALANCE_AMT
FROMDEBIT_TRANSACTIONS
WHERETRAN_DATE=’31-DEC-95’
高效:
SELECTACCT_NUM,BALANCE_AMT
FROMDEBIT_TRANSACTIONS
WHERETRAN_DATE=’31-DEC-95’
UNIONALL
SELECTACCT_NUM,BALANCE_AMT
FROMDEBIT_TRANSACTIONS
WHERETRAN_DATE=’31-DEC-95’
译者按:
必要注重的是,UNIONALL将反复输入两个了局汇合中不异纪录.因而列位仍是
要从营业需求剖析利用UNIONALL的可行性.
UNION将对了局汇合排序,这个操纵会利用到SORT_AREA_SIZE这块内存.关于这
块内存的优化也是相称主要的.上面的SQL能够用来查询排序的损耗量
Selectsubstr(name,1,25)"SortAreaName",
substr(value,1,15)"Value"
fromv$sysstat
wherenamelikesort%
42.利用提醒(Hints)
关于表的会见,可使用两种Hints.
FULL和ROWID
FULLhint告知ORACLE利用全表扫描的体例会见指定表.
比方:
SELECT/*+FULL(EMP)*/*
FROMEMP
WHEREEMPNO=7893;
ROWIDhint告知ORACLE利用TABLEACCESSBYROWID的操纵会见表.
一般,你必要接纳TABLEACCESSBYROWID的体例出格是当会见年夜表的时分,利用这类体例,你必要晓得ROIWD的值大概利用索引.
假如一个年夜表没有被设定为缓存(CACHED)表而你但愿它的数据在查询停止是仍旧停止
在SGA中,你就能够利用CACHEhint来告知优化器把数据保存在SGA中.一般CACHEhint和FULLhint一同利用.
比方:
SELECT/*+FULL(WORKER)CACHE(WORKER)*/*
FROMWORK;
索引hint告知ORACLE利用基于索引的扫描体例.你不用申明详细的索引称号
比方:
SELECT/*+INDEX(LODGING)*/LODGING
FROMLODGING
WHEREMANAGER=‘BILLGATES’;
在不利用hint的情形下,以上的查询应当也会利用索引,但是,假如该索引的反复值过量而你的优化器是CBO,优化器便可能疏忽索引.在这类情形下,你能够用INDEXhint强迫ORACLE利用该索引.
ORACLEhints还包含ALL_ROWS,FIRST_ROWS,RULE,USE_NL,USE_MERGE,USE_HASH等等.
译者按:
利用hint,暗示我们对ORACLE优化器缺省的实行路径不中意,必要手工修正.
这是一个很有技能性的事情.我倡议只针对特定的,多数的SQL举行hint的优化.
对ORACLE的优化器仍是要有信念(出格是CBO)
MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。 |
|