ORACLE數(shù)據(jù)庫操作手冊(cè)_第1頁
ORACLE數(shù)據(jù)庫操作手冊(cè)_第2頁
ORACLE數(shù)據(jù)庫操作手冊(cè)_第3頁
ORACLE數(shù)據(jù)庫操作手冊(cè)_第4頁
ORACLE數(shù)據(jù)庫操作手冊(cè)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

ORACLE數(shù)據(jù)庫操作手冊(cè)2[1]0

中國通信集團(tuán)公司安徽有限公司

計(jì)費(fèi)業(yè)務(wù)部

2007年11月

修改記錄

版本日期編輯者編輯內(nèi)容

1.02006/2/10見春蕾形成初稿

1.12007/8/31見春蕾根據(jù)實(shí)際情況修訂部分

章節(jié)

2.02007/11/05見春蕾一、在第一章(數(shù)據(jù)庫使

用注意事項(xiàng))中增加了關(guān)

于批量更新數(shù)據(jù)的大事

務(wù)分次提交的要求、客戶

端的配置方法、修改密碼

方法;

二、在第二章(SQL編寫

注意事項(xiàng))中增加了關(guān)于

提示(Hints)的使用。

三、增加了第四章(跟蹤

SQL執(zhí)行計(jì)劃),闡述了有

關(guān)的理論知識(shí)與SQL執(zhí)行

計(jì)劃的跟蹤方法。

目錄

ORACLE數(shù)據(jù)庫操作手冊(cè)2.0.......................................錯(cuò)誤!未定義書簽。

笫一章數(shù)據(jù)庫使用注意事項(xiàng).......................................................3

二、不使用數(shù)據(jù)庫時(shí)請(qǐng)及時(shí)關(guān)閉數(shù)據(jù)庫連接,但是也不能頻繁的連接與斷開.......3

三、執(zhí)行了DML操作,請(qǐng)按業(yè)務(wù)規(guī)則,不要不記得執(zhí)行COMMIT或者ROLLBACK。........3

四、假如是查詢與統(tǒng)計(jì)不涉及到當(dāng)天的業(yè)務(wù)時(shí),不要在生產(chǎn)環(huán)境里操作,在BCV庫中操

作。BCV每天晚上12點(diǎn)同步一次,數(shù)據(jù)與用戶口令、密碼與生產(chǎn)環(huán)境相同。......3

五、關(guān)聯(lián)表都很大的查詢與統(tǒng)計(jì)也盡量用BCV庫。...............................4

六、生產(chǎn)環(huán)境營業(yè)時(shí)間(特別是營業(yè)高峰時(shí)間,目前是上午8:00-10:00,下午3:00-4:00)

禁止做大數(shù)據(jù)量的查詢與統(tǒng)計(jì),每個(gè)查詢的執(zhí)行時(shí)間要操縱在1分鐘內(nèi)。.........4

七、不要執(zhí)行索引與表的信息的收集。.........................................4

八、編寫程序的時(shí)候,注意SQL語句規(guī)范,盡量使用變量綁定,減少共享池的使用。

................................................................4

九、按照標(biāo)準(zhǔn)要求編寫pl/sql等程序,注意事務(wù)的提交、回滾與對(duì)各類特殊情況的處

理。..........................................................................4

十、要查看表字段名或者隨機(jī)的少量數(shù)據(jù)時(shí)候,使用desc、也能夠使用wherel=2或者

者rowcountXn來查看,而盡量不要直接執(zhí)行select*fromtablename,然后kill會(huì)

話。..........................................................................4

十一、盡量使用索引,避免出現(xiàn)全表掃描,性能影響比單機(jī)更大。................4

十二、對(duì)分區(qū)表建立索引時(shí),使用local選項(xiàng)。.................................4

十三、不要在事務(wù)中引入Trigger,建議在事務(wù)中實(shí)現(xiàn)............................4

十四、批量更新數(shù)據(jù)的大的事務(wù)分次提交。.....................................4

十五、客戶端的配置,.........................................................5

十六、修改密碼。.............................................................5

第二章SQL編寫注意事項(xiàng).........................................................7

一、SELECT子句中避免使用*..................................................7

二、查找總記錄數(shù)時(shí),盡量不要用count(*),而要指定一個(gè)有索引的字段。.......7

三、將大的歷史表創(chuàng)建為分區(qū)表,便于數(shù)據(jù)轉(zhuǎn)儲(chǔ)與刪除。.........................7

四、使用分區(qū)表進(jìn)行查詢時(shí),盡量把分區(qū)鍵作為查詢條件的第一個(gè)條件。..........7

五、Sequence使用cache/noorder,假如在使用sequence上的列建索弓I,建議加大cache

值。..........................................................................7

六、在FROM子句中包含多個(gè)表的情況下,選擇記錄條數(shù)最少的表作為基礎(chǔ)表,放在FROM

子句的最后面。...............................................................7

七、WHERE子句中的連接順序...................................................8

八、在需要無條件刪除表中數(shù)據(jù)時(shí),用truncate代替delete。...................8

九、語句中盡量使用表的索引字段,避免做大表的全表掃描。....................8

十、帶通配符(%)的like語句...............................................9

H-一、用EXISTS替代1N..............................................9

十一、用NOTEXISTS替代NOTIN.......................................9

十三、盡可能的用UNION-ALL替換UNION................................10

十四、Orderby語句建議.....................................................10

十五、避免使用NOT.................................................11

十六、使用DECODE函數(shù)來減少處理時(shí)間........................................11

十七、刪除重復(fù)記錄..........................................................12

十八、假如能夠使用where條件,盡量不要在having中限制數(shù)據(jù)................12

十九、盡量不要使數(shù)據(jù)排序....................................................12

二十、使用提示(Hints)..............................................12

第三章oracle與Sybase的SQL區(qū)另1.......................................13

一、大小寫...................................................................13

二、限制記錄數(shù)量............................................................13

三、列的選擇.................................................................13

四、連接.....................................................................13

五、字符串函數(shù)..............................................................13

六、日期函數(shù).................................................................14

七、數(shù)據(jù)類型轉(zhuǎn)換函數(shù):.......................................................14

八、空值替代函數(shù):...........................................................14

九、Sybase的where語句執(zhí)行[]正則符號(hào),但是oracle9i不支持。.............14

十、數(shù)字取舍.................................................................14

第四章跟蹤SQL執(zhí)行計(jì)劃.........................................................15

一、理論.....................................................................15

(一)ORACLE優(yōu)化器..........................................................15

(二)訪問TABLE的方式......................................................15

(三)索引訪問方式.........................................................16

二、SETTRACE跟蹤sql執(zhí)行計(jì)劃..............................................16

第一章數(shù)據(jù)庫使用注意事項(xiàng)

一、對(duì)BOSSL5營帳庫,營業(yè)網(wǎng)址嚴(yán)格按照要求進(jìn)行配置,不可隨意更換。

營業(yè)網(wǎng)址要求按照下面方式進(jìn)行分配配置,假如隨意更換,會(huì)增加營業(yè)主機(jī)間的數(shù)據(jù)交互,

影響數(shù)據(jù)庫性能,降低營業(yè)工作效率。

合肥、六安、阜陽、宿州、亳州、淮北、黃山、銅陵配置:

或者者

蕪湖、蚌埠、淮南、馬鞍山、安慶、滁州、宣城、巢湖、池州,配置如下:

或者者

二、不使用數(shù)據(jù)庫時(shí)請(qǐng)及時(shí)關(guān)閉數(shù)據(jù)庫連接,但是也不能頻繁的連接與斷開

數(shù)據(jù)庫連接也是數(shù)據(jù)庫的寶貴資源,數(shù)據(jù)庫支持的數(shù)據(jù)庫連接有限,當(dāng)不需要使用數(shù)據(jù)庫時(shí),

請(qǐng)“優(yōu)雅”的退出數(shù)據(jù)庫吧,假如能正常退出,請(qǐng)別“結(jié)其任務(wù)”或者KILL-9。假如正在執(zhí)行

SQL的時(shí)候突然特殊終端,請(qǐng)聯(lián)系數(shù)據(jù)庫管理員檢叁處理,以防止數(shù)據(jù)庫一直占用該SQL有關(guān)資

源。

三、執(zhí)行了DML操作,請(qǐng)按業(yè)務(wù)規(guī)則,不要不記得執(zhí)行COMMIT或者ROLLBACK。

不要只執(zhí)行語句,而不操縱事務(wù)。當(dāng)你執(zhí)行一條DML語句時(shí),數(shù)據(jù)庫會(huì)為你分配鎖、回滾段、

REDOLOGBUFFER等資源。事務(wù)結(jié)束后,這些資源才能得以釋放。

四、假如是查詢與統(tǒng)計(jì)不涉及到當(dāng)天的業(yè)務(wù)時(shí),不要在生產(chǎn)環(huán)境里操作,在BCV

庫中操作。BCV每天晚上12點(diǎn)同步一次,數(shù)據(jù)與用戶口令、密碼與生產(chǎn)環(huán)境相

同。

bcv是一個(gè)節(jié)點(diǎn)的數(shù)據(jù)庫,所有的地市的查詢的連接配置是同一個(gè),如下:

YZDBBCV=

(DESCRIPTION=

(ADDRESSLIST=

(ADDRESS=(PROTOCOL=TCP)(HOST=10.153.192.45)(PORT=1521))

)

(CONNECT_DATA=

(SERVICE_NAME=yzdb)

)

)

五、關(guān)聯(lián)表都很大的查詢與統(tǒng)計(jì)也盡量用BCV庫。

六、生產(chǎn)環(huán)境營業(yè)時(shí)間(特別是營業(yè)高峰時(shí)間,目前是上午8:00-10:00,下午

3:00-4:00)禁止做大數(shù)據(jù)量的查詢與統(tǒng)計(jì),每個(gè)查詢的執(zhí)行時(shí)間要操縱在1分

鐘內(nèi)。

七、不要執(zhí)行索引與表的信息的收集。

八、編寫程序的時(shí)候,注意SQL語句規(guī)范,盡量使用變量綁定,減少共享池

的使用。

九、按照標(biāo)準(zhǔn)要求編寫pl/sql等程序,注意事務(wù)的提交、回滾與對(duì)各類特殊情

況的處理。

十、要查看表字段名或者隨機(jī)的少量數(shù)據(jù)時(shí)候,使用desc、也能夠使用wherel=2

或者者rowcountVn來查看,而盡量不要直接執(zhí)行select*fromtablename?然

后kill會(huì)話。

十一、盡量使用索引,避免出現(xiàn)全表掃描,性能影響比單機(jī)更大。

十二、對(duì)分區(qū)表建立索引時(shí),使用local選項(xiàng)。

十三、不要在事務(wù)中引入Trigger,建議在事務(wù)中實(shí)現(xiàn)。

十四、批量更新數(shù)據(jù)的大的事務(wù)分次提交。

在營帳數(shù)據(jù)庫系統(tǒng)繁忙時(shí)候,大于300萬的數(shù)據(jù)刷新,建議分次提交,減少特殊發(fā)生。

系統(tǒng)空閑時(shí),大于800萬的數(shù)據(jù)刷新,建議分次提交。

十五、客戶端的配置。

方法一、直接修改tnsnames.ora

YZDBBCV=

(DESCRIPTION=

(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=TCP)(HOST=10.147.192.45)(PORT=1521))

)

(CONNECT_DATA=

(SERVICE_NAME=yzdb)

)

)

方法二、使用客戶端工具

?adsin.3,X

文年Q)夕輯11)

o后退-」

WtQ)|&D:W>cl<vflHBJ

文悴要修改日期

HOMTlClt2005-10C3ie31

£口UB???1"”毋Off>c2002&73823

sgk每ca二蘆2OO7P7-231954

?口?■】or”必2002&73623

S。7ORA文怦2007-01-101034

?gaORA文傳2006-12-20OH

SQMORA文件2WP7-231954

62002-01-26901

ORA文M2WP7P1954

?latera?(Ei?l<

回?Aer0“C0Hie?

jDbArlkitn

*Oracle0r?2Ga?92■(JWhc.ScaD.val-xZ

國?ier?!鞍?/p>

?CcAfafwation5dT?<lt>AdBinistrationf?rYinds??MT

Q??XlhCA

(3Ejtttrj<>s*hctaD?t?b?s?C?oficurggAssisttfkt

9OrtOLDB

Q?97?7QtttckTouriD*ld>ai?V>sr&Ais>it*nl

爭力加

OI?t?Crat?dTodtEnteij?i???My”Cootfi(vrationAvtttta^t

。Ortel*KIT?Strvtr—Buildtf

COMO1?I?cr9*?ftODXAdMaMrZ”

4t)R?1““DysLtigM?tCc?tic?r?tion

用在方用比)

d-rtet1。d\89—\or35nU?Meh3

:3開始aORMZLESDR?q>>'41951

十六、修改密碼。

用sql*plus使用賬號(hào)連接數(shù)據(jù)庫

能夠從菜單進(jìn)入

也能夠從命令行窗口進(jìn)入

方法一、使用password命令

方法一、使用alter命令

Alteruser賬號(hào)identifiedby密碼

密碼規(guī)則問題:

有字符、數(shù)字、特殊字符

要六位以上

與往常密碼不能有三個(gè)以上相同的字符

第二章SQL編寫注意事項(xiàng)

一、SELECT子句中避免使用*

在SELECT子句中列內(nèi)所有的列時(shí),使用*很方便,但是效率低。由于ORACLE在解析的過

程中,會(huì)查詢數(shù)據(jù)字典,將*依次轉(zhuǎn)換成所有的列名。因此,直接在SELECT子句中寫出想要顯示

的列。

二、查找總記錄數(shù)時(shí),盡量不要用count(*),而要指定一個(gè)有索引的字段c

比如索引列為index,使用count(index),這樣能利月索引。

三、將大的歷史表創(chuàng)建為分區(qū)表,便于數(shù)據(jù)轉(zhuǎn)儲(chǔ)與刪除C

四、使用分區(qū)表進(jìn)行查詢時(shí),盡量把分區(qū)鍵作為查詢條件的第一個(gè)條件。

五、Sequence使用cache/noorder,假如在使用sequence上的列建索引,建議

加大cache值。

六、在FROM子句中包含多個(gè)表的情況下,選擇記錄條數(shù)最少的表作為基礎(chǔ)表,

放在FROM子句的最后面。

由于在基于規(guī)則的優(yōu)化器中,ORACLE的解析器按照從右到左的順序處理FROM子句中的表名。

FROM子句中寫在最后的表將被最先處理。

比如:

表TAB116,384條記錄

表TAB25條記錄

選擇TAB2作為基礎(chǔ)表(最好的方法)

selectcount(*)fromtabi,tab2...執(zhí)行時(shí)間0.96秒

選擇TABI作為基礎(chǔ)表(不佳的方法)

selectcount(*)fromtab2,tabi...執(zhí)行時(shí)間26.09秒

假如有3個(gè)以上的表連接查詢,那就需要選擇交叉表作為基礎(chǔ)表,交叉表是指那個(gè)被其他表

所引用的表

比如:

EMP表描述了LOCATION表與CATEGORY表的交集

SELECT*

FROMLOCATIONL,

CATEGORYC,

EMPE

WHEREE.EMPNOBETWEEN1000AND2000

ANDE.CAT_NO=C.CAT_NO

ANDE.LOCN=L.LOCN

將比下列SQL更有效率

SELECT*

FROMEMPE,

LOCATIONL,

CATEGORYC

WHEREE.CAT_NO=C.CATNO

ANDE.LOCN=L.LOCN

ANDE.EMP.NOBETWEEN1000AND2000

七、WHERE子句中的連接順序

ORACLE使用自下而上的順序解析叩IERE子句。根據(jù)這個(gè)原理,表之間的連接務(wù)必寫在其他

WHERE條件之前,那些能夠過濾掉最大數(shù)量記錄的條件務(wù)必寫在WHERE子句的末尾。

比如:

(低效,執(zhí)行時(shí)間156.3秒)

SELECT*

FROMEMPE

WHERESAL>50000

ANDJOB='MANAGER1

AND25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO);

(高效,執(zhí)行時(shí)間10.6W

SELECT*

FROMEMPE

WHERE25<(SELECTCOUNT(*)FROMEMPWHEREMGR=E.EMPNO)

ANDSAL>50000

ANDJOB='MANAGER1;

八、在需要無條件刪除表中數(shù)據(jù)時(shí),用truncate代替delete。

九、語句中盡量使用表的索引字段,避免做大表的全表掃描。

比如Where子句中有聯(lián)接的列,即使最后的聯(lián)接值為一個(gè)靜態(tài)值,也不可能使用索引。

select*fromemployee

wherefirst_nameII''Ilast_name='BeillCliton';

這條語句沒有使用基于lastname創(chuàng)建的索引.

當(dāng)使用下面這種SQL語句的編寫,Oracle系統(tǒng)就能夠使用基于lastjame創(chuàng)建的索引。

Select*fromemployee

wherefirst_namc='3ciirandlast_namc='Clitcn';

十、帶通配符(%)的like語句

比如SQL語句:

select*fromemployeewherelast_namelike'%cliton%';

由于通配符(%)在搜尋詞首出現(xiàn),因此Oracle系統(tǒng)不使用last_namc的索引。通配符如

此使用會(huì)降低查詢速度。當(dāng)通配符出現(xiàn)在字符串其他位置時(shí),優(yōu)化器就能利用索引。在下面的查

詢中索引得到了使用:

select*fromemployeewherelastnameliketc%';

H"一、用EXISTS替代IN

在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接在這種情

況下,使用EXISTS(或者NOTEXISTS)通常將提高查詢的效率.

低效:

SELECT*

FROMEMP(基礎(chǔ)表)

WHEREEMPNO>0

ANDDEPTNOIN(SELECTDEPTNO

FROMDEPT

WHERELOC='MELB')

高效:

SELECT*

FROMEMP(基礎(chǔ)表)

WHEREEMPNO>0

ANDEXISTS(SELECT'X'

FROMDEPT

WHEREDEPT.DEPTNO=EMP.DEPTNO

ANDLOC='MELB')

十二、用NOTEXISTS替代NOTIN

在子查詢中,NOTIN子句將執(zhí)行一個(gè)內(nèi)部的排序與合并.不管在哪種情況下,NOTIN都是最

低效的(由于它對(duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷).為了避免使用NOTIN,我們能夠把它改

寫成外連接(OuterJoins)或者NOTEXISTS.

比如:

SELECT…

FROMEMP

WHEREDEPT_NONOTIN(SELECTDEPT_NO

FROMDEPT

WHEREF)EPT_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');

十三、盡可能的用UNION-ALL替換UNION

當(dāng)SQL語句需要UNION兩個(gè)查詢結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UNION-ALL的方式被合并,

然后在輸出最終結(jié)果前進(jìn)行排序.

假如用UNIONALL替代UNION,這樣排序就不是必要了.效率就會(huì)因此得到提高.

舉例:

低效:

SELECTACCT_NUM,BALANCE_AMT

FROMDEBIT_TRANSACTTONS

WHERETRAN_DATE='31-DEC-951

UNION

SELECTACCT_NUM,BALANCE_AMT

FROMDEBIT_TRANSACTIONS

WHERETRAN_DATE='31-DEC-95'

高效:

SELECTACCT_NUM,BALANCE_AMT

FROMDEBITTRANSACTIONS

WHERETRANDATE='31-DEC-95'

UNIONALL

SELECTACCTNUM,BALANCE.AMT

FROMDEBIT_TRANSACTIONS

WHERETRAN_DATE='31-DEC-95'

十四、Orderby語句建議

ORDERBY語句決定了Oracle如何將返回的查詢結(jié)果排,孑。Orderby語句對(duì)要排序的列沒有

什么特別的限制,也能夠?qū)⒑瘮?shù)加入列中(象聯(lián)接或者者附加等)。任何在Orderby語句的非索

引項(xiàng)或者者有計(jì)算表達(dá)式都將降低查詢速度。

認(rèn)真檢查。rderby語句以找出非索引項(xiàng)或者者表達(dá)式,它們會(huì)降低性能。解決這個(gè)問題的辦

法就是重寫。rderby語句以使用索引,也能夠?yàn)樗褂玫牧薪⒘硗庖粋€(gè)索引,同時(shí)應(yīng)絕對(duì)避

免在。rderby子句中使用表達(dá)式。

十五、避免使用NOT

在查詢時(shí)經(jīng)常在where子句使用一些邏輯表達(dá)式,如大于、小于、等于與不等于等等,也能

夠使用and(與)、or(或者)與not(非)。NOT可用來對(duì)任何邏輯運(yùn)算符號(hào)取反。下面是一個(gè)

NOT子句的例子:

...wherenot(status='VALID')

假如要使用NOT,則應(yīng)在取反的短語前面加上括號(hào),并在短語前面加上NOT運(yùn)算符。NOT運(yùn)

算符包含在另外一個(gè)邏輯運(yùn)算符中,這就是不等于(?)運(yùn)算符。換句話說,即使不在查詢where

子句中顯式地加入NOT詞,NOT仍在運(yùn)算符中,見下例:

...wherestatus<>INVALID,;

再看下面這個(gè)例子:

select*fromemployeewheresalary<>3000;

對(duì)這個(gè)查詢,能夠改寫為不使用NOT:

select*fromemployeewheresalary<3000orsalary>3000:

盡管這兩種查詢的結(jié)果一樣,但是第二種查詢方案會(huì)比第一種查詢方案更快些。第二種查詢

同意Oracle對(duì)salary列使用索引,而第一種查詢則不能使用索引。

十六、使用DECODE函數(shù)來減少處理時(shí)間

使用DECODE函數(shù)能夠配免重復(fù)掃描相同記錄或者重復(fù)連接相同的表.

比如:

SELECTCOUNT(*),SUM(SAL)

FROMEMP

WHEREDEPT_NO=0020

ANDENAMELIKE'SMITH%';

SELECTCOUNT(*),SUM(SAL)

FROMEMP

WHEREDEPT_NO=0030

ANDENAMELIKE'SMITH%';

能夠用DECODE函數(shù)高效地得到相同結(jié)果

SELECTCOUNT(DECODE(DEPT_NO,0020,rXr,NULL))D0020_COUNT,

C0UNT(DECODE(DEPT_N0,0030,'X1,NULL))D0030_C0UNT,

SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,

SUM(DECODE(DEPTNO,0030,SAL,NULL))D0030SAL

FROMEMPWHEREENAMELIKE'SMITH%';

類似的,DECODE函數(shù)也能夠運(yùn)用于GROUPBY與ORDERBY子句中.

十七、刪除重復(fù)記錄

DELETEFROMEMPE

WHEREE.ROWID>(SELECTMIN(X.ROWID)

FROMEMPX

WHEREX.EMP_NO=E.EMP一NO);

十八、假如能夠使用where條件,盡量不要在having中限制數(shù)據(jù)

十九、盡量不要使數(shù)據(jù)排序

引起排序的條件

-Orderby

-Groupby

-Union,intersect,minus

-Distinct

二十、使用提示(Hints)

關(guān)于表的訪問,能夠使用兩種Hints:FULL與ROWID

?FULLhint告訴ORACLE使用全表掃描的方式訪問指定表.

比如:

SELECT/*+FULL(EMP)*/*

FROMEMP

WHEREEMPNO=7893;

?ROWIDhint告訴ORACLE使用TABLEACCESSBYROWID的操作訪問表.

通常,你需要使用TABLEACCESSBYROWID的方式特別是當(dāng)訪問大表的時(shí)候,使用這種方

式,你需要明白R(shí)0IM)的值或者者使用索引。

假如一個(gè)大表沒有被設(shè)定為緩存(CACHED)表而你希望它的數(shù)據(jù)在查詢結(jié)束是仍然停留在

SGA中,你就能夠使用CACHEhint來告訴優(yōu)化器把數(shù)據(jù)保留在SGA中。通常CACHEhir.t與

FULLhint一起使用。

比如:

SELECT/*+FULL(WORKER)CACHE(WORKER)*/*

FROMWORK;

索引hint告訴ORACLE使用基于索引的掃描方式.你不必說明具體的索引名稱

比如:

SELECT/*+INDEX(aindexname)*/LODGING

FROMLODGINGa

WHEREMANAGER='BILLGATES';

ORACLEhints還包含ALL.ROWS,FIRST_ROWS,RULE,USE_NL,USE_MERGE,USE_HASH等

等。能夠根據(jù)具體情況具體使用。

第三章oracle與Sybase的SQL區(qū)別

一、大小寫

SYBASE的SQL中數(shù)據(jù)庫名、表名與列名分大小寫,應(yīng)遵循定義時(shí)的寫法;ORACLE并不區(qū)分。

二、限制記錄數(shù)量

在SYBASESQL中限制紀(jì)錄的數(shù)量,需要用EXECSQLSETROWCOUNTn,用完需要執(zhí)行EXEC

SQLSETROWCOUNT0恢復(fù);而ORACLE中只需要在SQL中用SELECT*FROMwhere

rowcount<n來限制即可。

三、列的選擇

ORACLE執(zhí)行數(shù)據(jù)查詢的時(shí)候,SELECT語句務(wù)必選擇針對(duì)的數(shù)據(jù)表.在Oracle數(shù)據(jù)庫內(nèi)有一

種特殊的表DUAL。從DUAL表選擇數(shù)據(jù)常被用來通過SELECT語句計(jì)算常數(shù)表達(dá)式,由于DUAL只

有一行數(shù)據(jù),因此常數(shù)只返回一次。

Oracle下的DUAL查詢?nèi)缦滤荆?/p>

SELECT'x'FROMdual

在Sybase中,查詢則是下面這個(gè)樣子:

SELECT'x'

四、連接

Oracle用||符號(hào)作為連接符,而Sybase的連接符是加號(hào):+。

Oracle查詢?nèi)缦滤荆?/p>

Select'Name'II'LastName'FromtabieName

對(duì)應(yīng)的Sybase查詢?nèi)缦滤荆?/p>

Select'Name'+'LastName'

五、字符串函數(shù)

返回字符串長度函數(shù)

Sybase:char_length(string)或者dataiength(string)

oracle:length(string)

LENGTH與LEN

Sybase:SELECTLEN(SQLMAG1)"Lengthincharacters"

oracle:SELECTLENGIHCSQLMAG')"Lengthincharacters"FROMDUAL;

六、日期函數(shù)

取當(dāng)前系統(tǒng)日期時(shí)間

Sybase:getdateO返回datetimeeg:selectgetdateO

oracle:sysdate返回daleeg:selectsysdatefromdual;

日期的加法

Sybase:selectdatcadd(mm,12,getdateO)

oracle:selectaddmonths(sysdate,12)fromdual

日期的減法

Sybase:SELECTdatediff(dd,GetDateO.dateadd(mm,12,getdateO))

oracle:SELECTsysdate-add_months(sysdate,12)FROMdual

七、數(shù)據(jù)類型轉(zhuǎn)換函數(shù):

Sybase中轉(zhuǎn)換函數(shù)為convert(datatype,expression[.style]))

在oracle中不可用,應(yīng)用下列轉(zhuǎn)換函數(shù):

日期轉(zhuǎn)換字符to_char(date)

比如:selecttochar(sysdate,'yyyy/mm/ddhh24:mi:ss')fromdual;

結(jié)果:1999/09/0816:25:30

selecttochar(sysdate,*yyyymmdd,)fromdual;

結(jié)果:19990908

數(shù)字轉(zhuǎn)換字符tochar(numbers)

字符轉(zhuǎn)換日期to_date(string)

比如:selectto_date(*1999/09/0816:25:30*Jyyyy/nun/ddhh24:mi:ss,)

fromdual;

字符轉(zhuǎn)換數(shù)字to_number(string)

八、空值替代函數(shù):

Sybase中用isnull(exprl,expr2)

oracle中不能用isnull(),只能用nvl(exprl,expr2)

比如:

Sybase:selectisnull(pro_table_status,'0')frompos.product;

oracle:selectnvl(pro_table_status,'0')frompos.product;

九、Sybase的where語句執(zhí)行[]正則符號(hào),但是oracle9i不支持。

十、數(shù)字取舍

Oracle數(shù)據(jù)庫內(nèi)有一個(gè)TRUNC函數(shù),該函數(shù)返回m位十進(jìn)制數(shù)的n位;假如省略m則n就

是0位。m的值能夠?yàn)槔?表示截去小數(shù)點(diǎn)左邊m位數(shù)字.

在Sybase下能夠用Round或者者Floor<)

T列是Oracle查詢:

SELECTT1WNC(15.79.1)"Truncate"EROMDUAL;

下面是同類查詢的Sybase版本:

SELECTROUND(15.79,0)rounded,ROUND(15.79,0,1)truncated

SELECTFLOOR(ROUND(15.79,0)),FLOOR(ROUND(15.79,0.1))

第四章跟蹤SQL執(zhí)行計(jì)劃

一、理論

(一)ORACLE優(yōu)化器

?Oracle的優(yōu)化器有3種

基于規(guī)則RULE

基于成本COST

基于選擇CHOOSE

?設(shè)置缺省的優(yōu)化器,能夠通過對(duì)init.ora文件中OPTIMIZERJIODE參數(shù)設(shè)置,也能夠在會(huì)話

(session)級(jí)對(duì)其進(jìn)行覆蓋.

?假如OPTIMZER_MODE=RULE,則激活基于規(guī)則的優(yōu)化器1RB0)。基于規(guī)則的優(yōu)化器按照一系列

的語法規(guī)則來推測可能執(zhí)行路徑與比較可替換的執(zhí)行路徑。

?假如OPTIMZERJIODEXOST,則激活基于成本的優(yōu)化器[CBO)。它使用ANALYZE語句來生成數(shù)

據(jù)庫對(duì)象的統(tǒng)計(jì)數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)包含表的行數(shù)、平均長度及索引中不一致的關(guān)鍵字?jǐn)?shù)

等。甚于這些統(tǒng)計(jì)數(shù)據(jù),成本優(yōu)化器能夠計(jì)算出可獲得的執(zhí)行路徑的成本。并選擇具有最

小的成本執(zhí)行路徑。在CBO模式下,需要經(jīng)常運(yùn)行ANALYZE命令來確保數(shù)據(jù)的準(zhǔn)確性。

?假如OPTIMZERMODEXHOOSE,實(shí)際的優(yōu)化器模式將與是否運(yùn)行過analyze命令有關(guān).假如

table已經(jīng)被analyze過,優(yōu)化器模式將自動(dòng)成為CBG,反之,數(shù)據(jù)庫將使用RULE形式的

優(yōu)化器。

(二)訪問TABLE的方式

ORACLE使用兩種訪問表中記錄的方式:

?全表掃描

全表掃描就是順序地訪問表中每條記錄.ORACLE使用一次讀入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論