MYSQL编程:Oracle常}集(三)
列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋?oracle151.怎样O控SGA中字典n^的射中率?
selectparameter,gets,Getmisses,getmisses/(gets+getmisses)*100
"missratio",
(1-(sum(getmisses)/(sum(gets)+sum(getmisses))))*100"Hitratio"
fromv$rowcache
wheregets+getmisses0
groupbyparameter,gets,getmisses;
152.怎样O控SGA中共用^的射中率,小於1%?
selectsum(pins)"TotalPins",sum(reloads)"TotalReloads",
sum(reloads)/sum(pins)*100libcache
fromv$librarycache;
selectsum(pinhits-reloads)/sum(pins)"hit
radio",sum(reloads)/sum(pins)"reloadpercent"
fromv$librarycache;
153.怎样@示一切Y料物件的e和巨细?
selectcount(name)num_instances,type,sum(source_size)
source_size,
sum(parsed_size)parsed_size,sum(code_size)code_size
,sum(error_size)error_size,
sum(source_size)+sum(parsed_size)+sum(code_size)
+sum(error_size)size_required
fromdba_object_size
groupbytypeorderby2;
154.O控SGA中重做日I^的射中率,小於1%
SELECTname,gets,misses,immediate_gets,immediate_misses,
Decode(gets,0,0,misses/gets*100)ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100)ratio2
FROMv$latchWHEREnameIN(redoallocation,redocopy);
155.O控w和硬碟的排序比率,最好使它小於.10,增添sort_area_size
SELECTname,valueFROMv$sysstatWHEREnameIN(sorts(memory),
sorts(disk));
156.怎样O控前Y料l在行什麽SQLZ句?
SELECTosuser,username,sql_textfromv$sessiona,v$sqltextb
wherea.sql_address=b.addressorderbyaddress,piece;
157.怎样O控字典n^?
SELECT(SUM(PINS-RELOADS))/SUM(PINS)"LIBCACHE"FROM
V$LIBRARYCACHE;
SELECT(SUM(GETS-GETMISSES-USAGE-FIXED))/SUM(GETS)"ROW
CACHE"FROMV$ROWCACHE;
SELECTSUM(PINS)"EXECUTIONS",SUM(RELOADS)"CACHEMISSESWHILE
EXECUTING"FROMV$LIBRARYCACHE;
後者除之前者,此比率小於1%,靠近0%好。
SELECTSUM(GETS)"DICTIONARYGETS",SUM(GETMISSES)"DICTIONARY
CACHEGETMISSES"
FROMV$ROWCACHE
158.O控MTS
selectbusy/(busy+idle)"sharedserversbusy"fromv$dispatcher;
此值年夜於0.5r,敌杓哟
selectsum(wait)/sum(totalq)"dispatcherwaits"fromv$queuewhere
type=dispatcher;
selectcount(*)fromv$dispatcher;
selectservers_highwaterfromv$mts;
servers_highwater靠近mts_max_serversr,敌杓哟
159.怎样晓得前用舻ID
SQL>SHOWUSER;
OR
SQL>selectuserfromdual;
160.怎样检察碎片水平高的表
SELECTsegment_nametable_name,COUNT(*)extents
FROMdba_segmentsWHEREownerNOTIN(SYS,SYSTEM)GROUPBY
segment_name
HAVINGCOUNT(*)=(SELECTMAX(COUNT(*))FROMdba_segmentsGROUP
BYsegment_name);
162.怎样晓得表在表空g中的存ηr
selectsegment_name,sum(bytes),count(*)ext_quanfromdba_extents
where
tablespace_name=&tablespace_nameandsegment_type=TABLEgroup
bytablespace_name,segment_name;
163.怎样晓得索引在表空g中的存ηr
selectsegment_name,count(*)fromdba_extentswhere
segment_type=INDEXandowner=&owner
groupbysegment_name;
164、怎样晓得利用CPU多的用session
11是cpuusedbythissession
selecta.sid,spid,status,substr(a.program,1,40)
prog,a.terminal,osuser,value/60/100value
fromv$sessiona,v$processb,v$sesstatc
wherec.statistic#=11andc.sid=a.sidanda.paddr=b.addrorderby
valuedesc;
165.怎样晓得O器日I文件
以8I例
$ORACLE_HOME/NETWORK/LOG/LISTENER.LOG
166.怎样晓得O器滴募
以8I例
$ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA
167.怎样晓得TNSB接文件
以8I例
$ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA
168.怎样晓得Sql*Neth境文件
以8I例
$ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA
169.怎样晓得告诫日I文件
以8I例
$ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG
170.怎样晓得基础Y
以8I例
$ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL
171.怎样晓得创建Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL
172.怎样晓得创建用Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL
173.怎样晓得创建快照用Y料字典D
以8I例
$ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL
本v次要v的是SQLZ句的化办法!次要基於ORACLE9I的.
174./*+ALL_ROWS*/
标明φZ句Kx窕堕_N的化办法,K@得最好吞吐量,使Y源损耗最小化.
比方:
SELECT/*+ALL+_ROWS*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHERE
EMP_NO=CCBZZP;
175./*+FIRST_ROWS*/
标明φZ句Kx窕堕_N的化办法,K@得最好回rg,使Y源损耗最小化.
比方:
SELECT/*+FIRST_ROWS*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHERE
EMP_NO=CCBZZP;
176./*+CHOOSE*/
标明假如Y料字典中有L表的yY,⒒堕_N的化办法,K@得最好的吞吐量;
标明假如Y料字典中]有L表的yY,⒒兑t_N的化办法;
比方:
SELECT/*+CHOOSE*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHERE
EMP_NO=CCBZZP;
177./*+RULE*/
标明φZ句Kx窕兑t的化办法.
比方:
SELECT/*+RULE*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHERE
EMP_NO=CCBZZP;
178./*+FULL(TABLE)*/
标明Ρ磉x袢呙璧姆椒.
比方:
SELECT/*+FULL(A)*/EMP_NO,EMP_NAMFROMBSEMPMSAWHERE
EMP_NO=CCBZZP;
179./*+ROWID(TABLE)*/
提醒明_标明χ付ū砀ROWIDM行L.
比方:
SELECT/*+ROWID(BSEMPMS)*/*FROMBSEMPMSWHERE
ROWID>=AAAAAAAAAAAAAA
ANDEMP_NO=CCBZZP;
180./*+CLUSTER(TABLE)*/
提醒明_标明χ付ū磉x翊呙璧脑L办法,它只Υ匚锛行.
比方:
SELECT/*+CLUSTER*/BSEMPMS.EMP_NO,DPT_NOFROMBSEMPMS,BSDPTMS
WHEREDPT_NO=TEC304ANDBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
181./*+INDEX(TABLEINDEX_NAME)*/
标明Ρ磉x袼饕呙璺椒.
比方:
SELECT/*+INDEX(BSEMPMSSEX_INDEX)USESEX_INDEXBECAUSETHEREARE
FEWMALEBSEMPMS*/FROMBSEMPMSWHERESEX=M;
182./*+INDEX_ASC(TABLEINDEX_NAME)*/
标明Ρ磉x袼饕N绲呙璺椒.
比方:
SELECT/*+INDEX_ASC(BSEMPMSPK_BSEMPMS)*/FROMBSEMPMSWHERE
DPT_NO=CCBZZP;
183./*+INDEX_COMBINE*/
指定表x顸cDL路,假如INDEX_COMBINE中]有供应作档乃饕,⑦x癯鳇cD索引的
布林M合体例.
比方:
SELECT/*+INDEX_COMBINE(BSEMPMSSAL_BMIHIREDATE_BMI)*/*FROM
BSEMPMS
WHERESAL<5000000ANDHIREDATE<SYSDATE;<SPAN>
184./*+INDEX_JOIN(TABLEINDEX_NAME)*/
提醒明_命令化器利用索引作L路.
比方:
SELECT/*+INDEX_JOIN(BSEMPMSSAL_HMIHIREDATE_BMI)*/SAL,HIREDATE
FROMBSEMPMSWHERESAL<60000;
185./*+INDEX_DESC(TABLEINDEX_NAME)*/
标明Ρ磉x袼饕绲呙璺椒.
比方:
SELECT/*+INDEX_DESC(BSEMPMSPK_BSEMPMS)*/FROMBSEMPMSWHERE
DPT_NO=CCBZZP;
186./*+INDEX_FFS(TABLEINDEX_NAME)*/
χ付ǖ谋绦锌焖偃饕呙,而不是全表呙璧霓k法.
比方:
SELECT/*+INDEX_FFS(BSEMPMSIN_EMPNAM)*/*FROMBSEMPMSWHERE
DPT_NO=TEC305;
187./*+ADD_EQUALTABLEINDEX_NAM1,INDEX_NAM2,...*/
提醒明_M行绦幸的x,瘟兴饕呙韬掀.
比方:
SELECT/*+INDEX_FFS(BSEMPMSIN_DPTNO,IN_EMPNO,IN_SEX)*/*FROM
BSEMPMSWHEREEMP_NO=CCBZZPANDDPT_NO=TDC306;
188./*+USE_CONCAT*/
Σ樵中的WHERE後面的ORl件M行DQUNIONALL的M合查.
比方:
SELECT/*+USE_CONCAT*/*FROMBSEMPMSWHEREDPT_NO=TDC506AND
SEX=M;
189./*+NO_EXPAND*/
WHERE後面的OR大概IN-LIST的查Z句,NO_EXPAND⒆柚蛊浠化器ζ溥M行U展.
比方:
SELECT/*+NO_EXPAND*/*FROMBSEMPMSWHEREDPT_NO=TDC506AND
SEX=M;
190./*+NOWRITE*/
克制Σ樵K的查重操纵.
191./*+REWRITE*/
能够⒁D作.
192./*+MERGE(TABLE)*/
能σD的各查M行相暮.
比方:
SELECT/*+MERGE(V)*/A.EMP_NO,A.EMP_NAM,B.DPT_NOFROMBSEMPMSA
(SELETDPT_NO
,AVG(SAL)ASAVG_SALFROMBSEMPMSBGROUPBYDPT_NO)VWHERE
A.DPT_NO=V.DPT_NO
ANDA.SAL>V.AVG_SAL;
193./*+NO_MERGE(TABLE)*/
队锌珊愕囊D不再合.
比方:
SELECT/*+NO_MERGE(V)*/A.EMP_NO,A.EMP_NAM,B.DPT_NOFROMBSEMPMS
A(SELETDPT_NO
,AVG(SAL)ASAVG_SALFROMBSEMPMSBGROUPBYDPT_NO)VWHERE
A.DPT_NO=V.DPT_NO
ANDA.SAL>V.AVG_SAL;
194./*+ORDERED*/
根沓霈F在FROM中的序,ORDERED使ORACLE依此序ζ溥B接.
比方:
SELECT/*+ORDERED*/A.COL1,B.COL2,C.COL3FROMTABLE1A,TABLE2
B,TABLE3C
WHEREA.COL1=B.COL1ANDB.COL1=C.COL1;
195./*+USE_NL(TABLE)*/
⒅付ū砼c嵌套的B接的行源M行B接,K把指定表作炔勘.
比方:
SELECT/*+ORDEREDUSE_NL(BSEMPMS)*/
BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAMFROMBSEMPMS,BSDPTMS
WHEREBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
196./*+USE_MERGE(TABLE)*/
⒅付ǖ谋砼c其他行源通^合闩判蜻B接体例B接起.
比方:
SELECT/*+USE_MERGE(BSEMPMS,BSDPTMS)*/*FROMBSEMPMS,BSDPTMS
WHERE
BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
197./*+USE_HASH(TABLE)*/
⒅付ǖ谋砼c其他行源通^哈希B接体例B接起.
比方:
SELECT/*+USE_HASH(BSEMPMS,BSDPTMS)*/*FROMBSEMPMS,BSDPTMSWHERE
BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
198./*+DRIVING_SITE(TABLE)*/
制cORACLE所x竦奈恢貌煌谋磉M行查绦.
比方:
SELECT/*+DRIVING_SITE(DEPT)*/*FROMBSEMPMS,DEPT@BSDPTMSWHERE
BSEMPMS.DPT_NO=DEPT.DPT_NO;
199./*+LEADING(TABLE)*/
⒅付ǖ谋碜B接序次中的首表.
200./*+CACHE(TABLE)*/
M行全表呙r,CACHE提醒能⒈淼z索K安排在n^嬷凶罱钌倭斜LRU的比来利用端
比方:
SELECT/*+FULL(BSEMPMS)CAHE(BSEMPMS)*/EMP_NAMFROMBSEMPMS;
201./*+NOCACHE(TABLE)*/
M行全表呙r,CACHE提醒能⒈淼z索K安排在n^嬷凶罱钌倭斜LRU的比来利用端
比方:
SELECT/*+FULL(BSEMPMS)NOCAHE(BSEMPMS)*/EMP_NAMFROMBSEMPMS;
202./*+APPEND*/
间接拔出到表的最後,能够进步速率.
insert/*+append*/intotest1select*fromtest4;
203./*+NOAPPEND*/
通^在拔出Z句保存期韧VK行形式映R迦.
insert/*+noappend*/intotest1select*fromtest4;
ORACLE化器
.x用m合的ORACLE化器
ORACLE的化器共有3N:
a.RULE(基於t)b.COST(基於本钱)c.CHOOSE(x裥)
O置缺省的化器,能够通^init.ora文件中OPTIMIZER_MODE档母鞣N明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS
.你然也在SQL句或是(session)ζ溥M行覆w.
了利用基於本钱的化器(CBO,Cost-BasedOptimizer),你必常行analyze
命令,以增添Y估中的物件yY(objectstatistics)的蚀_性.
假如Y料的化器形式O置x裥(CHOOSE),那麽H的化器形式⒑褪欠襁行^analyze命令有P.
假如table已被analyze^,化器形式⒆映CBO,反之,Y料裼RULE情势的化器.
在缺省情r下,ORACLE裼CHOOSE化器,了制止那些不用要的全表呙(fulltablescan),
你必量制止利用CHOOSE化器,而间接裼没兑t大概基於本钱的化器.
2.LTable的体例
ORACLE裼煞NL表中的体例:
a.全表呙
全表呙杈褪琼序地L表中每l.ORACLE裼靡淮巫x进多Y料K(databaseblock)的体例化全表呙.
b.通^ROWIDL表
你能够裼没ROWID的L体例情r,进步L表的效力,,
ROWID包括了表中的物理地位Y..ORACLE裼盟饕(INDEX)F了Y料和寄存Y料的物理地位(ROWID)之g的M.
一般索引供应了疾速LROWID的办法,因而那些基於索引列的查就能够失掉功能上的进步.
3.共用SQLZ句
了不重剖析不异的SQLZ句,在第一次剖析之後,ORACLESQLZ句寄存在w中.@K位於系y全局^域SGA(system
globalarea)的共用池(sharedbufferpool)中的w能够被一切的Y料用艄灿.
因而,你绦幸SQLZ句(有r被Q一游)r,假如它
和之前的绦羞^的Z句完整不异,ORACLE就可以很快@得已被剖析的Z句和最好的
绦新.ORACLE的@功效年夜年夜地进步了SQL的绦行阅K省了w的利用.
惋惜的是ORACLE只蔚谋硖峁└咚倬n(cachebuffering),@功效K不m用於多表B接查.
Y料办理T必在init.ora中@^域O置合m的,@w^域越年夜,就能够保存更多的Z句,然被共用的大概性也就越年夜了.
你向ORACLE提交一SQLZ句,ORACLE紫仍谶@Kw中查找不异的Z句.
@Y必要说明的是,ORACLE烧袢〉氖且环N栏衿ヅ,要_成共用,SQLZ句必
完整不异(包含空格,Q行等).
共用的Z句必M足三l件:
A.字元的比^:
前被绦械末路Z句和共用池中的Z句必完整不异.
比方:
SELECT*FROMEMP;
和以下每都分歧
SELECT*fromEMP;
Select*FromEmp;
SELECT*FROMEMP;
B.Z句所指的物件必完整不异:
比方:
用物件名怎样L
Jacksal_limitprivatesynonym
Work_citypublicsynonym
Plant_detailpublicsynonym
Jillsal_limitprivatesynonym
Work_citypublicsynonym
Plant_detailtableowner
考]一下以下SQLZ句可否在@用糁g共用.
SQL
可否共用
缘故原由
selectmax(sal_cap)fromsal_limit;
不克不及
每用舳加幸privatesynonym-sal_limit,它是分歧的物件
selectcount(*0fromwork_citywheresdesclikeNEW%;
能
用粼L不异的物件publicsynonym-work_city
selecta.sdesc,b.locationfromwork_citya,plant_detailbwhere
a.city_id=b.city_id
不克不及
用jack通^privatesynonymLplant_detail而jill是表的一切者,物件分歧.
C.SQLZ句中必利用不异的名字的定(bindvariables)
比方:
第一M的SQLZ句是不异的(能够共用),而第二M中的Z句是分歧的(即便在行r,x於分歧的定迪嗤闹)
a.
selectpin,namefrompeoplewherepin=:blk1.pin;
selectpin,namefrompeoplewherepin=:blk1.pin;
b.
selectpin,namefrompeoplewherepin=:blk1.ot_ind;
selectpin,namefrompeoplewherepin=:blk1.ov_ind;
4.x褡钣行实谋砻序(只在基於t的化器中无效)
ORACLE的剖析器依照右到左的序FROM子句中的表名,因而FROM子句中在最後的表(基A表driving
table)⒈蛔钕忍.在FROM子句中包括多表的情r下,你必x裼l底钌俚谋碜基A表.ORACLE矶表r,
用排序及合愕姆绞竭B接它.起首,呙璧谝表(FROM子句中最後的那表)KτM行派序,然後呙璧诙表(FROM子句中最後第二表),最後⑺第二表中z索出的c第一表中合mM行合.
比方:
表TAB116,384l
表TAB21l
xTAB2作基A表(最好的办法)
selectcount(*)fromtab1,tab2绦rg0.96秒
xTAB2作基A表(欠安的办法)
selectcount(*)fromtab2,tab1绦rg26.09秒
假如有3以上的表B接查,那就必要x窠徊姹(intersectiontable)作基A表,
交织表是指那被其他表所援用的表.
比方:
EMP表形貌了LOCATION表和CATEGORY表的交集.
SELECT*
FROMLOCATIONL,
CATEGORYC,
EMPE
WHEREE.EMP_NOBETWEEN1000AND2000
ANDE.CAT_NO=C.CAT_NO
ANDE.LOCN=L.LOCN
⒈认铝SQL更无效率
SELECT*
FROMEMPE,
LOCATIONL,
CATEGORYC
WHEREE.CAT_NO=C.CAT_NO
ANDE.LOCN=L.LOCN
ANDE.EMP_NOBETWEEN1000AND2000
5.WHERE子句中的B接序.
ORACLE裼米韵露系捻序剖析WHERE子句,根@道理,表之g的B接必在其他WHEREl件之前,
那些能够^V失落最悍贼坑的l件必在WHERE子句的开端.
比方:
(低效,绦rg156.3秒)
SELECT…
FROMEMPE
WHERESAL>50000
ANDJOB=‘MANAGER’
AND25<(SELECTCOUNT(*)FROMEMP
WHEREMGR=E.EMPNO);
(高效,绦rg10.6秒)
SELECT…
FROMEMPE
WHERE25<(SELECTCOUNT(*)FROMEMP
WHEREMGR=E.EMPNO)
ANDSAL>50000
ANDJOB=‘MANAGER’;
6.SELECT子句中制止利用‘*‘
你想在SELECT子句中列出一切的COLUMNr,利用BSQL列援用‘*’
是一便利的办法.不幸的是,@是一十分低效的办法.H上,ORACLE在剖析的^程中,’*’顺次DQ成一切的列名,
@事情是通^查Y料字典完成的,@意味著⒑馁M更多的rg.
7.p少LY料的次
绦忻lSQLZ句r,ORACLE在炔绦辛嗽S多事情:剖析SQLZ句,预算索引的使用率,定,xY料K等等.
由此可,p少LY料的次,就可以H上p少ORACLE的事情量.
比方,
以下有三N办法能够z索出雇T等於0342或0291的T.
办法1(最低效)
SELECTEMP_NAME,SALARY,GRADE
FROMEMP
WHEREEMP_NO=342;
SELECTEMP_NAME,SALARY,GRADE
FROMEMP
WHEREEMP_NO=291;
办法2(次低效)
DECLARE
CURSORC1(E_NONUMBER)IS
SELECTEMP_NAME,SALARY,GRADE
FROMEMP
WHEREEMP_NO=E_NO;
BEGIN
OPENC1(342);
FETCHC1INTO…,..,..;
…..
OPENC1(291);
FETCHC1INTO…,..,..;
CLOSEC1;
END;
办法3(高效)
SELECTA.EMP_NAME,A.SALARY,A.GRADE,
B.EMP_NAME,B.SALARY,B.GRADE
FROMEMPA,EMPB
WHEREA.EMP_NO=342
ANDB.EMP_NO=291;
注重:
在SQL*Plus,SQL*Forms和Pro*C中从头O置ARRAYSIZE,能够增添每次Y料L的z索Y料量
,建h值200
8.利用DECODE函p少rg
利用DECODE函悼梢员苊庵呙柘嗤或重B接不异的表.
比方:
SELECTCOUNT(*),SUM(SAL)
FROM EMP
WHEREDEPT_NO=0020
ANDENAMELIKE ‘SMITH%’;
SELECTCOUNT(*),SUM(SAL)
FROM EMP
WHEREDEPT_NO=0030
ANDENAMELIKE ‘SMITH%’;
你能够用DECODE函蹈咝У氐玫较嗤Y果
SELECTCOUNT(DECODE(DEPT_NO,0020,’X’,NULL))D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,’X’,NULL))D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SAL
FROMEMPWHEREENAMELIKE‘SMITH%’;
似的,DECODE函狄部梢赃用於GROUPBY和ORDERBY子句中.
9.整合,oP的Y料L
假如你有蔚馁Y料查Z句,你能够把它整合到一查中(即便它之g]有PS)
比方:
SELECTNAME
FROMEMP
WHEREEMP_NO=1234;
SELECTNAME
FROMDPT
WHEREDPT_NO=10;
SELECTNAME
FROMCAT
WHERECAT_TYPE=‘RD’;
下面的3查能够被合愠梢:
SELECTE.NAME,D.NAME,C.NAME
FROMCATC,DPTD,EMPE,DUALX
WHERENVL(‘X’,X.DUMMY)=NVL(‘X’,E.ROWID(+))
ANDNVL(‘X’,X.DUMMY)=NVL(‘X’,D.ROWID(+))
ANDNVL(‘X’,X.DUMMY)=NVL(‘X’,C.ROWID(+))
ANDE.EMP_NO(+)=1234
ANDD.DEPT_NO(+)=10
ANDC.CAT_TYPE(+)=‘RD’;
(g者按:m然袢∵@N办法,效力失掉进步,可是程式的可x性年夜年夜下降,以是x者是要嗪庵g的利害)
10.h除重
最高效的h除重办法(因利用了ROWID)
DELETEFROMEMPE
WHEREE.ROWID>(SELECTMIN(X.ROWID)
FROMEMPX
WHEREX.EMP_NO=E.EMP_NO);
11.用TRUNCATE替换DELETE
h除表中的r,在一般情r下,回L段(rollbacksegments)用泶娣趴梢员换的Y.
假如你]有COMMIT事,ORACLE①Y料恢到h除之前的B(蚀_地f是
恢到绦h除命令之前的r)
而用TRUNCATEr,
回L段不再寄存任何可被恢的Y.命令行後,Y料不克不及被恢.因而很少的Y源被{用,绦rg也芏.
(g者按:TRUNCATE只在h除全表m用,TRUNCATE是DDL不是DML)
12.量多利用COMMIT
只需有大概,在程式中量多利用COMMIT,@映淌降男阅艿玫教岣,需求也COMMIT所放的Y源而p少:
COMMIT所放的Y源:
a.回L段上用於恢Y料的Y.
b.被程式Z句@得的i
c.redologbuffer中的空g
d.ORACLE办理上述3NY源中的炔炕ㄙM
(g者按:在利用COMMITr需要注重到事盏耐暾,F中效力和事胀暾酝囚~和熊掌不成得兼)
13.算l
和一样平常的^c相反,count(*)比count(1)稍快,然假如能够通^索引z索,λ饕械挠等耘f是最快的.比方
COUNT(EMPNO)
(g者按:在CSDN,曾Υ擞羞^相崃业挠,
作者的^cK不非常蚀_,通^H的y,上述三N办法K]有@著的功能差e)
14.用Where子句替QHAVING子句
制止利用HAVING子句,HAVING只z索出一切之後才Y果集M行^V.@硇枰判,等操纵.
假如能通^WHERE子句限定的的,那就可以p少@方面的_N.
比方:
低效:
SELECTREGION,AVG(LOG_SIZE)
FROMLOCATION
GROUPBYREGION
HAVINGREGIONREGION!=‘SYDNEY’
ANDREGION!=‘PERTH’
高效
SELECTREGION,AVG(LOG_SIZE)
FROMLOCATION
WHEREREGIONREGION!=‘SYDNEY’
ANDREGION!=‘PERTH’
GROUPBYREGION
(g者按:HAVING中的l件一样平常用於σ恍┘虾档谋容^,如COUNT()等等.
除此而外,一样平常的l件在WHERE子句中)
15.p少Ρ淼牟樵
在含有子查的SQLZ句中,要特e注重p少Ρ淼牟樵.
比方:
低效
SELECTTAB_NAME
FROMTABLES
WHERETAB_NAME=(SELECTTAB_NAME
FROMTAB_COLUMNS
WHEREVERSION=604)
AND DB_VER=(SELECTDB_VER
FROMTAB_COLUMNS
WHEREVERSION=604)
高效
SELECTTAB_NAME
FROMTABLES
WHERE(TAB_NAME,DB_VER)
=(SELECTTAB_NAME,DB_VER)
FROMTAB_COLUMNS
WHEREVERSION=604)
Update多Column例子:
低效:
UPDATEEMP
SETEMP_CAT=(SELECTMAX(CATEGORY)FROMEMP_CATEGORIES),
SAL_RANGE=(SELECTMAX(SAL_RANGE)FROMEMP_CATEGORIES)
WHEREEMP_DEPT=0020;
高效:
UPDATEEMP
SET(EMP_CAT,SAL_RANGE)
=(SELECTMAX(CATEGORY),MAX(SAL_RANGE)
FROMEMP_CATEGORIES)
WHEREEMP_DEPT=0020;
16.通^炔亢堤岣SQL效力.
SELECTH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
FROMHISTORY_TYPET,EMPE,EMP_HISTORYH
WHEREH.EMPNO=E.EMPNO
ANDH.HIST_TYPE=T.HIST_TYPE
GROUPBYH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;
通^{用上面的函悼梢蕴岣咝.
FUNCTIONLOOKUP_HIST_TYPE(TYPINNUMBER)RETURNVARCHAR2
AS
TDESCVARCHAR2(30);
CURSORC1IS
SELECTTYPE_DESC
FROMHISTORY_TYPE
WHEREHIST_TYPE=TYP;
BEGIN
OPENC1;
FETCHC1INTOTDESC;
CLOSEC1;
RETURN(NVL(TDESC,’’));
END;
FUNCTIONLOOKUP_EMP(EMPINNUMBER)RETURNVARCHAR2
AS
ENAMEVARCHAR2(30);
CURSORC1IS
SELECTENAME
FROMEMP
WHEREEMPNO=EMP;
BEGIN
OPENC1;
FETCHC1INTOENAME;
CLOSEC1;
RETURN(NVL(ENAME,’’));
END;
SELECTH.EMPNO,LOOKUP_EMP(H.EMPNO),
H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)
FROMEMP_HISTORYH
GROUPBYH.EMPNO,H.HIST_TYPE;
(g者按:常在锌吹饺’能不克不及用一SQL出….’的N子,却不知}s的SQL常常奚绦行.
能蛘莆丈厦娴倪用函到Q}的办法在H事情中长短常成心x的)
17.利用表的e名(Alias)
在SQLZ句中B接多表r,
利用表的e名K把e名字首於每Column上.@右,就能够p少剖析的rgKp少那些由Column歧x引发的Z法e`.
(g者注:
Column歧x指的是由於SQL中分歧的表具有不异的Column名,SQLZ句中出F@Columnr,SQL剖析器o法判噙@Column的w)
18.用EXISTS替换IN
在S多基於基A表的查中,了M足一l件,常常必要α硪表M行接.在@N情r下,利用EXISTS(或NOT
EXISTS)一般⑻岣卟樵的效力.
低效:
SELECT*
FROMEMP(基A表)
WHEREEMPNO>0
ANDDEPTNOIN(SELECTDEPTNO
FROMDEPT
WHERELOC=‘MELB’)
高效:
SELECT*
FROMEMP(基A表)
WHEREEMPNO>0
ANDEXISTS(SELECT‘X’
FROMDEPT
WHEREDEPT.DEPTNO=EMP.DEPTNO
ANDLOC=‘MELB’)
(g者按:相碚f,用NOTEXISTS替QNOTIN⒏@著地进步效力,下一中⒅赋)
19.用NOTEXISTS替换NOTIN
在子查中,NOTIN子句绦幸炔康呐判蚝秃.o在哪N情r下,NOTIN都是最低效的
(因它ψ硬樵中的表绦辛艘全表遍).了制止利用NOTIN,我能够把它改成外B接(OuterJoins)或NOT
EXISTS.
比方:
SELECT…
FROMEMP
WHEREDEPT_NONOTIN(SELECTDEPT_NO
FROMDEPT
WHEREDEPT_CAT=’A’);
了进步效力.改:
(办法一:高效)
SELECT….
FROMEMPA,DEPTB
WHEREA.DEPT_NO=B.DEPT(+)
ANDB.DEPT_NOISNULL
ANDB.DEPT_CAT(+)=‘A’
(办法二:最高效)
SELECT….
FROMEMPE
WHERENOTEXISTS(SELECT‘X’
FROMDEPTD
WHERED.DEPT_NO=E.DEPT_NO
ANDDEPT_CAT=‘A’);
20.用表B代替QEXISTS
一般碚f,裼帽磉B接的体例比EXISTS更无效率
SELECTENAME
FROMEMPE
WHEREEXISTS(SELECT‘X’
FROMDEPT
WHEREDEPT_NO=E.DEPT_NO
ANDDEPT_CAT=‘A’);
(更高效)
SELECTENAME
FROMDEPTD,EMPE
WHEREE.DEPT_NO=D.DEPT_NO
ANDDEPT_CAT=‘A’;
(g者按:在RBO的情r下,前者的绦新包含FILTER,後者利用NESTEDLOOP)
只需每年花费2000到5000美元。无论你是自掏腰包来创建一个新兴公司,还是得到了风险投资商的赞助,使用MySQL都可以降低你所需要的人力成本。 外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。 代替了原来VB式的错误判断。比Oracle高级不少。 对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 我们学到了什么?思考问题的时候从表的角度来思考问
页:
[1]