仓酷云

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

[学习教程] MYSQL网页设计ORACLE SQL功能优化系列 (十二)

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:39:54 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

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制定的商业许可协议。
飘灵儿 该用户已被删除
沙发
 楼主| 发表于 2015-3-27 08:09:24 | 显示全部楼层
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-22 08:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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