Oracle企業(yè)資產(chǎn)管理_第1頁
Oracle企業(yè)資產(chǎn)管理_第2頁
Oracle企業(yè)資產(chǎn)管理_第3頁
Oracle企業(yè)資產(chǎn)管理_第4頁
Oracle企業(yè)資產(chǎn)管理_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第七章管理Oracle對象管理表概覽

表是最基本的數(shù)據(jù)庫對象,它用于存儲用戶數(shù)據(jù),關(guān)系數(shù)據(jù)庫的所有操作最終都是圍繞用戶表進(jìn)行的。在Oracle數(shù)據(jù)庫中,按照存儲方式的不同,表可以分為普通表、分區(qū)表、索引組織表以及簇表等四種表。

1.表結(jié)構(gòu)

表是Oracle數(shù)據(jù)庫數(shù)據(jù)存儲的基本單元,在表中是通過行和列來組織數(shù)據(jù)的。一張表一般都具有多個列,或者稱為字段,每個字段都具有特定的屬性,包括字段名、字段數(shù)據(jù)類型、字段長度、約束、默認(rèn)值等,這些屬性在表創(chuàng)建時即被確定。而表的每一行存放一條信息。2.基本的數(shù)據(jù)類型

當(dāng)建立表時,不僅要指定表名、列名,而且要根據(jù)情況為列選擇合適的數(shù)據(jù)類型以及長度。下面介紹一些常用的Oracle數(shù)據(jù)類型:

CHAR(N)該數(shù)據(jù)類型用于定義固定長度的字符串,其最大長度為2000字節(jié)。假定定義COLA列為CHAR(100),并且該列的數(shù)據(jù)為“ACCESS”,這時雖“ACCESS”只有六個字符,但COLA列仍將占用100字節(jié)的空間。

VARCHAR2(N)該數(shù)據(jù)類型用于定義可變長度的字符串,其最大長度為4000字節(jié)。假定定義COLA列為VARCHAR2(100),并且該列的數(shù)據(jù)為“ACCESS”,那么COLA列將占用6字節(jié)的空間。所以使用VARCHAR2類型可以節(jié)省空間,但CHAR類型存取速度更快。

NUMBER(P,S)該數(shù)據(jù)類型用于定義數(shù)字類型的數(shù)據(jù),其中P是精度,表示數(shù)字的總位數(shù),而S是刻度范圍,表示小數(shù)點(diǎn)后的位數(shù)。精度和刻度范圍都是可選的,但若指定了刻度范圍,那么必須指定精度。假定定義SAL列為NUMBER(4,3),若該列的數(shù)據(jù)為123.4567,則存儲錯誤,因?yàn)槌隽司确秶?;若該列的?shù)據(jù)為1.234567,則實(shí)際存儲的數(shù)據(jù)為1.235,因?yàn)楫?dāng)被指派值超出了刻度范圍時,存儲值按照刻度范圍指定的數(shù)字位的位數(shù)進(jìn)行舍入。另外,定義整數(shù)還可以直接使用INT數(shù)據(jù)類型。

DATE該數(shù)據(jù)類型用于定義日期時間數(shù)據(jù),其長度為7個字節(jié)。RAW(N)該數(shù)據(jù)類型用于定義二進(jìn)制數(shù)據(jù),其最大長度為2000字節(jié)。通常用來存儲小型二進(jìn)制數(shù)據(jù)。

存儲大對象的數(shù)據(jù)類型Oracle為存儲大對象(LOB)提供了六種數(shù)據(jù)類型Long,longrawLob(CLOB、BLOB.BFILE、NCLOB)

一個表只能有一個LONG或LONGRAW列一個表上可以有多個LOB列最多2gb最多4gbSelect返回?cái)?shù)據(jù)Select返回定位器與其他列數(shù)據(jù)存放在一起小于4000:與其他列存放在一起大于4000:存放到LOB段無對象類型支持支持對象類型順序訪問隨機(jī)訪問

其中:CLOB和LONG用于存儲大型的、固定寬度字符數(shù)據(jù);BLOB和LONGRAW用于存儲非結(jié)構(gòu)化數(shù)據(jù),如二進(jìn)制圖象;NCLOB用于存儲大型的、固定寬度字符集數(shù)據(jù);BFILE用于存儲操作系統(tǒng)文件中的非結(jié)構(gòu)化數(shù)據(jù)。

3.數(shù)據(jù)的存儲方式當(dāng)創(chuàng)建表時,Oracle會自動從指定的表空間中為新建的表創(chuàng)建一個數(shù)據(jù)段,而該表的所有數(shù)據(jù)都會存放到相應(yīng)的表段中。

表的行數(shù)據(jù)存儲在數(shù)據(jù)塊中,如果一個塊的大小足夠容納一條記錄,Oracle就將一條記錄完整的存儲在一個數(shù)據(jù)塊中。一般情況,記錄按列定義順序來存放,但若使用LONG或LONGRAW類型,那么它們的數(shù)據(jù)總是放在記錄的尾部。如果表中某字段允許為NULL,若NULL值字段位于非NULL值字段的中間,則需使用1字節(jié)的空間來存儲NULL值字段的長度;若NULL值字段位于一條記錄的末尾,將不需要任何存儲空間來存儲NULL值。因此,在定義表時候,應(yīng)當(dāng)將可能包含NULL值的字段放在字段列表的末尾,這樣可以節(jié)省存儲空間。

4.ROWIDROWID用于惟一標(biāo)識表行。當(dāng)執(zhí)行INSERT操作時,服務(wù)器進(jìn)程會將數(shù)據(jù)插人到表段的相應(yīng)數(shù)據(jù)塊中,并且Oracle會生成惟一的ROWID對應(yīng)于該行數(shù)據(jù)。ROWID間接地給出了表行的物理存放位置,它是定位表行最快速的方式。ROWID占用10個字節(jié)的存儲空間,而顯示結(jié)果為18個字符,具體格式如下:

OOOOOOFFFBBBBBBRRR數(shù)據(jù)對象號

相對文件號

數(shù)據(jù)塊號

行號

數(shù)據(jù)對象號:表的惟一對象標(biāo)識號。當(dāng)建立表時,Oracle會為該表分配惟一的數(shù)據(jù)對象號。相對文件號:表空間內(nèi)數(shù)據(jù)文件的惟一標(biāo)識號。塊號:行所在數(shù)據(jù)塊的位置。

行號:行在塊內(nèi)的位置。

因?yàn)閯?chuàng)建了一個表就創(chuàng)建了一個段,而一個段只能駐留在一個表空間中,所以使用數(shù)據(jù)對象編號,Oracle服務(wù)器可以確定表所在的表空間;又因?yàn)楸砜臻g的數(shù)據(jù)都存放在數(shù)據(jù)文件中,使用相對文件編號Oracle可以確定存放表數(shù)據(jù)的數(shù)據(jù)文件;數(shù)據(jù)文件用數(shù)據(jù)塊來存儲數(shù)據(jù),使用數(shù)據(jù)塊編號可知表的某一行數(shù)據(jù)存放在哪個數(shù)據(jù)塊中;而一個數(shù)據(jù)塊可能存放多行數(shù)據(jù),利用行號就可以定位表中的任一行了。

ROWID是表的偽列,用戶在查看表的結(jié)構(gòu)時不會看到ROWID字段,但和其它字段一樣,可以在執(zhí)行SELECT操作時直接引用。但是因?yàn)橛脩魺o法直接讀懂ROWID內(nèi)容,所以在引用ROWID時通常使用DBMS_ROWID將其轉(zhuǎn)變?yōu)榭勺x取的內(nèi)容。

selectdeptno,dbms_rowid.rowid_relative_fno(rowid)||'.'||dbms_rowid.rowid_block_number(rowid)||'.'||dbms_rowid.rowid_row_number(rowid)行位置fromdept;7.1.2建表建表是使用createtable命令完成的,,執(zhí)行該命令令要求用戶必必須具有createtable系統(tǒng)權(quán)限;如如果要在其他他用戶模式中中建表,則要要求用戶必須須具有createanytable系統(tǒng)權(quán)限。當(dāng)當(dāng)建立表時,,Oracle會為該表分配配相應(yīng)的表段段,因?yàn)楸矶味嗡杩臻g是是從表空間上上分配的,所所以要求表的的所有者必須須要在表空間間上具有相應(yīng)應(yīng)的空間配額額或具有unlimitedtablespace系統(tǒng)權(quán)限。1.建立普通表普通表是存儲儲用戶數(shù)據(jù)最最常用的方式式。當(dāng)建立普普通表時,Oracle會自動為該表表建立相應(yīng)的的段,并且段段的名稱與表表名完全相同同,而且段的的數(shù)據(jù)只能存存放在一個表表空間中。創(chuàng)創(chuàng)建普通表的的語法如下::CREATETABLE[schema.]table(columndatatype[,columndatatype]…)[TABLESPACEtablespace][PCTFREEinteger][PCTUSEDinteger][INITRANSinteger][MAXTRANSinteger][STORAGEstorage-clause][LOGGING|NOLOGGING][CACHE|NOCACHE]現(xiàn)對命令中各各參數(shù)說明如如下:TABLESPACE:標(biāo)識要在其中中創(chuàng)建表的表表空間。如果果創(chuàng)建表時沒沒有顯式的指指定表所處的的表空間,則則表被創(chuàng)建在在當(dāng)前用戶的的默認(rèn)表空間間中。PCTFREE和PCTUSED:PCTFREE參數(shù)用于指定定塊中必須保保留的最小空空閑空間比例例,PCTUSED參數(shù)用于指定定當(dāng)數(shù)據(jù)塊達(dá)達(dá)到PCTFREE參數(shù)的限制之之后(這時數(shù)數(shù)據(jù)塊被標(biāo)記記為不可用)),數(shù)據(jù)塊能能夠被再次使使用前,已占占用的存儲空空間必須低于于的比例。INITRANS和MAXTRANS:INITRANS與MAXTRANS參數(shù)用于指定定針對同一個個塊所允許的的并發(fā)事務(wù)數(shù)數(shù)目。每當(dāng)一一個DML事務(wù)訪問表中中的一個數(shù)據(jù)據(jù)塊時,該事事務(wù)會在數(shù)據(jù)據(jù)塊的塊頭部部(BlockHeader)中保存一個個條目,用于于標(biāo)記該事務(wù)務(wù)正在使用這這個數(shù)據(jù)塊。。當(dāng)該事務(wù)結(jié)結(jié)束時,它所所對應(yīng)的條目目被刪除。在創(chuàng)建表時,,Oracle將在表中每個個數(shù)據(jù)塊的頭頭部空間中分分配可以存儲儲INITRANS個事務(wù)條目的的空間。這部部分存儲空間間是永久性的的,只能用來來存儲事務(wù)條條目。當(dāng)一個個DML事務(wù)訪問這個個數(shù)據(jù)塊時,,Oracle首先將該事務(wù)務(wù)的條目存儲儲在塊頭部空空間中。當(dāng)塊塊頭部空間已已經(jīng)存儲了INITRANS個事務(wù)條目后后,再沒有多多余的空閑空空間來存儲其其他的事務(wù)條條目了。這時時若還有別的的事務(wù)要訪問問這個數(shù)據(jù)塊塊,Oracle將在數(shù)據(jù)塊的的空閑空間中中為事務(wù)條目目分配存儲空空間(如果在在塊中還有空空閑空間的話話)。這部分分空閑空間是是動態(tài)分配的的,回收以后后可以用于存存儲其他數(shù)據(jù)據(jù)。能夠在空空閑空間中存存儲的事務(wù)條條目數(shù)量等于于MAXTRANS參數(shù)值減去INITRANS參數(shù)的值。STORAGE:用于指指定段的存儲儲參數(shù),若不不指定存儲參參數(shù),那么Oracle會使用表空空間的默認(rèn)存存儲參數(shù)。在STORAGE子句中中可以設(shè)置下下面6個存儲參數(shù):INITIAL:為表的數(shù)據(jù)據(jù)段分配的第第一個區(qū)的大大小。NEXT:為表的數(shù)據(jù)據(jù)段分配的第第二個區(qū)的大大小。PCTINCREASE:指定從第二二個區(qū)開始,,為表的數(shù)據(jù)據(jù)段分配的區(qū)區(qū)的大小增加加比例。即每每個區(qū)的大小小等于前一個個區(qū)的大小乘乘以(1+PCTINCREASE/100))。如果表處處于本地管理理方式的表空空間中,則該該參數(shù)被忽略略。MINEXTENTS:允許為表的的數(shù)據(jù)段分配配的最小區(qū)數(shù)數(shù)目。MAXEXTENTS:允許為表的的數(shù)據(jù)段分配配的最大區(qū)數(shù)數(shù)目。如果表表處于本地管管理方式的表表空間中,則則該參數(shù)被忽忽略。BUFFER_POOL:指定表的數(shù)數(shù)據(jù)塊的緩存存池。LOGGING和NOLOGGING:使用了LOGGING,則表的創(chuàng)建建操作(包括括通過查詢創(chuàng)創(chuàng)建表時的插插入記錄操作作)都將記錄錄到重做日志志中,若用NOLOGGING,則表的創(chuàng)建建操作不會被被記錄到重做做日志中。默默認(rèn)情況將使使用LOGGING子句。NOLOGGING子句適合于通通過查詢創(chuàng)建建表的情況。。CACHE和NOCACHE:在創(chuàng)建表時時默認(rèn)使用NOCACHE子句。但對于于比較小又經(jīng)經(jīng)常查詢的表表,可以使用用CACHE子句。下面是一個在在data表空間上建立立employee表的例子。createtableemployee(idnumber(7),last_namevarchar2(25),dept_idnumber(7))pctfree20pctused50storage(initial200knext200kpctincrease0maxextents50)tablespacedata;2.復(fù)制表使用CREATETABLE命令不僅可以以建立表結(jié)構(gòu)構(gòu),而且還可可以將已存在在表的結(jié)構(gòu)和和數(shù)據(jù)復(fù)制到到另一張新表表中。另外為為了盡快復(fù)制制表的數(shù)據(jù),,復(fù)制表時可可以指定PARALLEL選項(xiàng)和NOLOGGlNG選項(xiàng),示例如如下:createtablenew_empparallel2nologgingasselect*fromscott.emp;其中,paralleldegree用于指指定執(zhí)行并行行操作,parallel2表示示由兩個并行行服務(wù)器進(jìn)程程執(zhí)行數(shù)據(jù)加加載操作。另另外使用Nologging,在重重做日志中沒沒有記錄下創(chuàng)創(chuàng)建表的操作作3.建立臨時表通過createtable語句創(chuàng)建的表表是永久性的的表,即其中中的記錄可以以一直保存下下來。與之對對應(yīng),在Oracle中還可以創(chuàng)建建臨時表(TemporaryTable)。與普通表不同同,臨時表中中的數(shù)據(jù)在使使用完畢后自自動刪除?!啊笆褂猛戤叀薄庇袃煞N情況況:事務(wù)結(jié)束束和會話結(jié)束束。在創(chuàng)建臨時表表時若使用了了oncommitdeleterows子句,則說明明臨時表是事事務(wù)級別的。。這時Oracle將在每次提交交事務(wù)時對臨臨時表進(jìn)行刪刪減操作,即即刪除表中的的所有數(shù)據(jù)。。若使用了oncommitpreserverows子句,則說明明臨時表是會會話級別的。。這時Oracle將直到會話終終止時才對臨臨時表進(jìn)行刪刪減操作。下面語句就建建立了名稱為為employee_temp的臨時表,該該臨時表將在在每次事務(wù)提提交時進(jìn)行刪刪減操作:createglobaltemporarytableemployee_temponcommitdeleterowsasselect*fromscott.emp;4.建立索引組織織表一般情況下,,表與索引數(shù)數(shù)據(jù)分別存放放在表段和索索引段中。但但索引組織表表(IOT)比較特殊,,它將表的數(shù)數(shù)據(jù)和索引數(shù)數(shù)據(jù)存儲在一一起,即以B樹索引的方式式來組織表中中的數(shù)據(jù)。非鍵列鍵列行頭普通表及其索索引索引組織表要創(chuàng)建索引組組織表,必須須在CREATETABLE語句中顯式地地指定organizationindex關(guān)鍵字。另外外,在索引組組織表中必須須建立一個primarykey主碼約束。下下面語句就創(chuàng)創(chuàng)建了一個索索引組織表employees。createtableemployees(empnonumber(5)primarykey,enamevarchar2(15)notnull,salnumber(7,2),jobvarchar2(10))organizationindextablespaceusers;在索引組織表表中,如果要要獲得對常用用字段更快的的訪問速度,,可以應(yīng)用““溢出”存儲儲功能,將表表中的不常訪訪問的非主碼碼不再存儲在在B樹的葉節(jié)點(diǎn)中中,而是存儲儲在一個具有有堆組織方式式的溢出存儲儲區(qū)中。對于于大型的索引引組織表,使使用溢出存儲儲能夠大大減減少索引組織織表所占用的的存儲空間,,同時又可提提高對常用字字段的查詢效效率。如果要啟用溢溢出存儲功能能,必須在創(chuàng)創(chuàng)建索引組織織表時指定OVERFLOW子句,此外還還需使用INCLUDING子句或PCTTHRESHOLD子句來設(shè)置溢溢出存儲的方方式。如下所所示:createtablesales_info(idnumber(6)primarykey,customer_namevarchar(30),sales_amountnumber(10,2),sales_datedate,remarkvarchar2(200))organizationindexpctthreshold20includingremarkoverflowtablespaceusers;其中中,,PCTTHRESHOLD指定定在在數(shù)數(shù)據(jù)據(jù)塊塊中中為為主主鍵鍵列列和和部部分分非非主主鍵鍵列列所所預(yù)預(yù)留留空空間間的的百百分分比比。。如如上上例例所所示示,,假假定定數(shù)數(shù)據(jù)據(jù)塊塊剩剩余余空空間間已已經(jīng)經(jīng)低低于于20%,,那那么么Oracle會將將INCLUDING子句句后后所所有有列列的的數(shù)數(shù)據(jù)據(jù)存存放放到到溢溢出出段段。。而INCLUDINGremark則指如果果數(shù)據(jù)塊塊剩余空空間低于于PCTTHRESHOLD,那么Oracle會將該子子句列remark后的所有有列數(shù)據(jù)據(jù)存放到到溢出段段,OVERFLOWTABLESPACE指定了溢溢出段所所在的表表空間。。5.建立分區(qū)區(qū)表分區(qū)是指指將一張張大表的的數(shù)據(jù)進(jìn)進(jìn)行物理理劃分,,并最終終將其數(shù)數(shù)據(jù)放到到幾個相相對較小小的表分分區(qū)段中中。當(dāng)執(zhí)執(zhí)行SQL語句訪問問分區(qū)表表時,系系統(tǒng)可以以直接訪訪問某個個表分區(qū)區(qū)段,而而不需要要訪問整整張表的的所有數(shù)數(shù)據(jù),從從而降低低磁盤I/O,提高系系統(tǒng)性能能。Oracle提供了范范圍分區(qū)區(qū)、散列列分區(qū)、、列表分分區(qū)以及及組合分分區(qū)四種種分區(qū)方方法。范圍分區(qū)區(qū)范圍分區(qū)區(qū)是按照照分區(qū)字字段中值值的范圍圍來對表表進(jìn)行分分區(qū),是是最常用用的分區(qū)區(qū)類型。。范圍分分區(qū)通常常用于分分區(qū)字段段是日期期類型的的表。假定一張張銷售表表年數(shù)據(jù)據(jù)總量達(dá)達(dá)到10GB,每個季季度平均均2.5GB,如果使使用普通通表存儲儲數(shù)據(jù),,那么10G數(shù)據(jù)會存存放到一一個表段段SALES中,那么么在統(tǒng)計(jì)計(jì)一季度度銷售數(shù)數(shù)據(jù)時需需要掃描描10GB數(shù)據(jù);而而如果使使用表分分區(qū)段,,那么可可以將一一、二、、三、四四季度數(shù)數(shù)據(jù)分別別存放到到不同表表分區(qū)段段中,此此時統(tǒng)計(jì)計(jì)一季度度銷售數(shù)數(shù)據(jù)只需需要掃描描2.5GB數(shù)據(jù)。顯顯然,使使用表分分區(qū)段可可以大大大降低I/O次數(shù),并并提高I/O性能。下下面以建建立SALES表為例,,說明使使用范圍圍分區(qū)建建立分區(qū)區(qū)表的方方法,示示例如下下:createtablesales(customer_idnumber(3),sales_amountnumber(10,2),sales_datedate)partitionbyrange(sales_date)(partitionplvalueslessthan('01-APR-2001'),partitionp2valueslessthan('01-JUL-2001'),partitionp3valueslessthan('01-OCT-2001'),partitionp4valueslessthan('01-JAN-2002'));當(dāng)在分區(qū)區(qū)表上執(zhí)執(zhí)行INSERT操作時,,系統(tǒng)會會自動按按照sales_date值的范圍圍將數(shù)據(jù)據(jù)插入到到相應(yīng)的的分區(qū)段段上。例例如:insertintosalesvalues(1,28500,'25-JAN-2001');insertintomalesvalues(2,30500,'25-MAY-2001');當(dāng)執(zhí)行了了上述INSERT語句之后后,會將將第一條條數(shù)據(jù)插插入到分分區(qū)P1上,而第第二條數(shù)數(shù)據(jù)被插插入到分分區(qū)P2上。當(dāng)執(zhí)執(zhí)行SELECT、UPDATE、DELETE操作時,,如果在在WHERE子句中引引用了分分區(qū)列,,那么Oracle會自動在在相應(yīng)分分區(qū)上執(zhí)執(zhí)行操作作,從而而降低I/O操作的次次數(shù),進(jìn)進(jìn)而提高高性能。。列表分區(qū)區(qū)如果分區(qū)區(qū)字段的的值并不不能劃分分范圍((非數(shù)字字或日期期數(shù)據(jù)類類型),,同時分分區(qū)字段段的取值值范圍只只是一個個包含少少數(shù)值的的集合,,那么可可以對表表進(jìn)行列列表分區(qū)區(qū)。在進(jìn)進(jìn)行列表表分區(qū)時時,需要要為每個個分區(qū)指指定一個個取值列列表,分分區(qū)字段段值處于于同一個個取值列列表中的的記錄被被存儲在在同一個個分區(qū)中中。列表分區(qū)區(qū)適用于于那些分分區(qū)字段段是一些些無序的的或者無無關(guān)的取取值集合合的表。。下面以以建立sales_by_region表表為例,,說明使使用列表表分區(qū)建建立分區(qū)區(qū)表的方方法,示示例如下下:createtablesales_by_region(deptnonumber,dnamevarchar2(20),quarterly_salesnumber(10,2),cityvarchar2(10))partitionbylist(city)(partitionplvalues('北京','上海'),partitionp2values('重重慶','廣廣州'),partitionp3values('南京','武漢'));其中,PARTITIONBYLIST(column)指定分區(qū)區(qū)方法為為列表分分區(qū),column指定分區(qū)區(qū)列名。。當(dāng)執(zhí)行了了上述命命令之后后,Oracle會為表sales_by_region建立三個個分區(qū)段段。當(dāng)在在分區(qū)表表上執(zhí)行行INSERT操作時,,系統(tǒng)會會自動按按照city列的值將將數(shù)據(jù)插插入到相相應(yīng)的分分區(qū)段上上,例如如:insertintosales_by_regionvalues(10,'SALES',20800,'上海');insertintosales_by_regionvalues(10,'SALES',24800,'重慶慶');insertintosales_by_regionvalues(10,‘‘SALES’,28800,‘‘武漢’);當(dāng)執(zhí)行了了上述INSERT語句之后后,會將將第一條條數(shù)據(jù)插插入到分分區(qū)P1上,第二二條數(shù)據(jù)據(jù)則會被被插入到到分區(qū)P2上,而第第三條數(shù)數(shù)據(jù)則會會被插入入到分區(qū)區(qū)P3上。當(dāng)執(zhí)執(zhí)行SELECT、UPDATE、DELETE操作時,,如果WHERE子句引用用了分區(qū)區(qū)列,那那么Oracle會自動在在相應(yīng)分分區(qū)上執(zhí)執(zhí)行操作作,從而而降低I/O操作的次次數(shù),進(jìn)進(jìn)而提高高性能。。散列分區(qū)區(qū)在進(jìn)行范范圍分區(qū)區(qū)或列表表分區(qū)的的時候,,有時由由于用戶戶無法對對各個分分區(qū)中可可能具有有的記錄錄數(shù)目進(jìn)進(jìn)行預(yù)測測,可能能會產(chǎn)生生某個分分區(qū)中記記錄很多多,而某某個分區(qū)區(qū)中記錄錄很少的的不平衡衡分區(qū)情情況。這這時應(yīng)創(chuàng)創(chuàng)建散列列分區(qū)。。散列分區(qū)區(qū)是指按按照Oracle所提供的的散列(HASH)函數(shù)來計(jì)計(jì)算列值值數(shù)據(jù),,并最終終按照函函數(shù)結(jié)果果來分區(qū)區(qū)數(shù)據(jù)。。下面以以建立分分區(qū)表PRODUCT為例,說說明使用用散列分分區(qū)建立立分區(qū)表表的方法法,示例例如下::createtableproduct(product_idnumber(6),descriptionvarchar2(30))partitionbyhash(product_id)(partitionpltablespacelocall,partitionp2tablespacelocal2);其中,PARTITIONBYHASH(column)指定分區(qū)區(qū)方法為為散列分分區(qū),column指定分區(qū)區(qū)列名。。當(dāng)在散散列分區(qū)區(qū)表上插插入數(shù)據(jù)據(jù)時,系系統(tǒng)會自自動在分分區(qū)列PRODUCT_ID上使用用散列函函數(shù)進(jìn)行行運(yùn)算,,并根據(jù)據(jù)運(yùn)算結(jié)結(jié)果將數(shù)數(shù)據(jù)均勻勻地放置置到不同同分區(qū)。。組合分區(qū)顧名思義,組組合分區(qū)實(shí)際際上組合了范范圍分區(qū)和散散列分區(qū),它它首先按照列列值范圍從邏邏輯上進(jìn)行范范圍分區(qū),然然后在每個范范圍分區(qū)的基基礎(chǔ)上再按照照散列函數(shù)進(jìn)進(jìn)行散列分區(qū)區(qū)。當(dāng)不同范范圍的數(shù)據(jù)分分布比較均勻勻時,Oracle建議直接使用用范圍分區(qū)。。對于某些表表來說,盡管管數(shù)據(jù)是按照照一定范圍分分布的,但因因?yàn)椴煌秶鷩臄?shù)據(jù)分布布不均勻,所所以此時可以以使用組合分分區(qū)來有效地地分布表的數(shù)數(shù)據(jù)。createtablesales_order(order_idnumber,order_datedate,product_idnumber,quantitynumber)partitionbyrange(order_date)subpartitionbyhash(product_id)subpartitions2storein(users,userl)(partitionp1valueslessthan('01-APR-2001'),partitionp2valueslessthan('01-JUL-2001'),partitionp3valueslessthan('01-OCT-2001'),partitionp4valueslessthan('01-JAN-2002'));其中,STOREIN用于指定散列列分區(qū)所在表表空間。在執(zhí)行了上述述命令之后,,首先按照ORDER_DATE列值進(jìn)行范圍圍分區(qū),此時時建立四個邏邏輯上的范圍圍分區(qū)。然后后按照PRODUCT_ID列值進(jìn)行散列列分區(qū),并將將邏輯上的四四個范圍分區(qū)區(qū)最終轉(zhuǎn)化成成8個物理上的散散列分區(qū)段。。當(dāng)給該組合分分區(qū)表插入數(shù)數(shù)據(jù)時,首先先按照order_date列值區(qū)邏輯確確定其所在區(qū)區(qū),然后用散散列函數(shù)計(jì)算算product_id的散列值,最最終確定數(shù)據(jù)據(jù)應(yīng)該放到哪哪個分區(qū)中。。6.建立簇表一般情況下,,建立表時Oracle會為該表分配配相應(yīng)的表段段。例如,當(dāng)當(dāng)建立表DEPT和EMP時,Oracle會分別為這兩兩張表分配表表段DEPT、EMP。并且它們的的數(shù)據(jù)會分別別存放到這兩兩個表段中。DEPTNODNAMELOC10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTONDEPTDEPTNODNAMESAL20SMITH80030ALLEN160030WARD124020SCOTT200030DEVE1800EMPDEPTEMP表DEPT的所有數(shù)據(jù)存存放在表段DEPT中,而EMP表的所有數(shù)據(jù)據(jù)則存放在表表段EMP中。假定用戶戶經(jīng)常需要執(zhí)執(zhí)行類似于““SELECTdname,ename,salFROMdept,empWHEREdept.deptno=emp.deptnoANDdept.deptno=10”的連接查詢詢語句來檢索索部門及其雇雇員的相關(guān)信信息,那么至至少需要2次的I/O操作,因?yàn)楸肀鞤EPT和EMP的數(shù)據(jù)分別存存放在兩個表表段中。這時時,為了降低低硬盤I/O操作的開銷,,可以把這兩兩張表的數(shù)據(jù)據(jù)組織到簇中中。簇是一種用于于存儲表中數(shù)數(shù)據(jù)的可選方方法。在一個個簇中,Oracle將多個表的相相關(guān)字段聚簇簇在相同的數(shù)數(shù)據(jù)塊中。比比如,EMP表和DEPT表都具有DEPTNO字段,DEPTNO字段就是這兩兩個表的相關(guān)關(guān)字段(簇鍵鍵)。如果將將EMP表和DEPT表聚簇在一起起,那么Oracle會按照部門的的DEPTNO在物理上存儲儲兩個表的所所有記錄。簇DEPT_EMP(DEPT、EMP)簇鍵(deptno)10ACCOUNTINGNEWYORKCLARK2450KING500020RESEARCHDALLASSMITH800SCOTT2000DEPT_EMP創(chuàng)建簇使用CREATECLUSTER語句,執(zhí)行該該命令要求用用戶要有CREATECLUSTER系統(tǒng)權(quán)限;如如果要在其他他用戶模式中中建立簇,則則要有CREATEANYCLUSTER系統(tǒng)權(quán)限。當(dāng)當(dāng)建立簇時,,Oracle會為該簇分配配相應(yīng)的簇段段,因?yàn)榇囟味嗡杩臻g是是從表空間上上分配的,所所以要求簇所所有者必須要要在表空間上上具有相應(yīng)的的空間配額或或具有UNLIMITEDTABLESPACE系統(tǒng)權(quán)限。示示例如下:createclusterdept_emp(deptnonumber(3))pctfree20pctused60size500tablespaceusersstorage(initial200Knext200Kminextents3pctincrease0maxextents50);創(chuàng)建簇后,還還要建簇表。。建立簇表要要求用戶必須須具有CREATETABLE系統(tǒng)權(quán)限,如如果要在其他他用戶模式中中建立簇表,,則必須具有有CREATEANYTABLE系統(tǒng)權(quán)權(quán)限。。另外外,因因?yàn)榇卮乇頂?shù)數(shù)據(jù)是是放在在簇段段中的的,所所以用用戶不不需要要任何何表空空間配配額或或UNLIMITEDTABLESPACE系統(tǒng)權(quán)權(quán)限。。為了了將表表組織織到簇簇中,,在建建表時時必須須指定定CLUSTER子句。。建立立簇表表的示示例如如下::createtabledept(deptnonumber(3)primarykey,dnamevarchar2(14),locvarchar2(13))clusterdept_emp(deptno);當(dāng)執(zhí)行行了上上述命命令后后,將將表DEPT增加到到簇DEPT_EMP中了。。需要要注意意的是是,當(dāng)當(dāng)建立立簇表表時不不能指指定STORAGE子句和和塊空空間使使用參參數(shù)。。當(dāng)建立立了簇簇和簇簇表之之后,,在插插入數(shù)數(shù)據(jù)之之前必必須首首先建建立簇簇索引引,否否則會會顯示示錯誤誤信息息。createindexdept_emp_idxonclusterdept_emptablespaceindxstorage(initial20Knext20Kpctincrease0);7.1.3修改表表1.增增加和和刪除除字段段如果目目前的的字段段不能能夠完完整地地標(biāo)識識表的的所有有屬性性,那那么通通過增增加字字段可可以間間接地地增加加表的的屬性性。使使用ALTERTABLE命令可可以給給表增增加字字段,,示例例如下下:altertabledepartmentaddphonevarchar2(10);altertabledepartmentaddmanagervarchar2(10);使用ALTERTABLE…DROP語句能能夠刪刪除刪刪除表表中不不再需需要使使用的的字段段。但但是注注意不不能刪刪除表表中所所有的的字段段,也也不能能刪除除SYS模式中中任何何表中中的字字段。。如果果僅需需要刪刪除一一個字字段,,必須須在字字段名名之前前指定定COLUMN關(guān)鍵字字。比比如,,下列列語句句將刪刪除EMPLOYEES表中的的AGE字段::altertableemployeesdropcolumnage;如果要要在一一條語語句中中刪除除多個個字段段,則則需要要將刪刪除的的字段段名放放在括括號中中,相相互間間用逗逗號隔隔開,,并且且不能能用COLUMN關(guān)鍵字字。比比如::altertableemployeesdrop(age,sal);當(dāng)刪除除字段段時,,如果果該表表包含含了大大量數(shù)數(shù)據(jù),,那么么刪除除列的的時間間就會會很長長。如如果時時間因因素必必須考考慮,,而字字段也也不再再需要要,那那么你你可以以先將將字段段標(biāo)記記為UNUSED列,然然后在在適當(dāng)當(dāng)時機(jī)機(jī)刪除除該列列的所所有數(shù)數(shù)據(jù)。。標(biāo)記記列為為UNUSED的方法法如下下:altertableempsetunusedcolumncomm.;當(dāng)將列列標(biāo)記記為UNUSED之后,,會從從數(shù)據(jù)據(jù)字典典中刪刪除該該列的的信息息,并并且在在查看看表結(jié)結(jié)構(gòu)時時也不不會看看到該該列的的信息息。但但是該該列的的數(shù)據(jù)據(jù)仍然然存在在,如如果要要刪除除UNUSED列的數(shù)數(shù)據(jù),,則必必須執(zhí)執(zhí)行如如下語語句::altertableempdropunusedcolumnscheckpoint1000;其中CHECKPOINTl000用于指指定每每刪除除1000行發(fā)出出一次次檢查查點(diǎn),,以節(jié)節(jié)省回回滾段段的空空間使使用。。2.修改表表的參參數(shù)設(shè)設(shè)置在表創(chuàng)創(chuàng)建之之后,,可以以使用用ALTERTABLE語句來來改變變表的的塊參參數(shù)設(shè)設(shè)置和和部分分存儲儲參數(shù)數(shù)設(shè)置置。語語法如如下::ALTERTABLE[schema.]table[storage-clause][PCTFREEinteger][PCTUSEDinteger][INITRANSinteger][MAXTRANSinteger]如,利利用下下面的的語句句可以以為EMPLOYEES表重新新設(shè)置置PCTFREE和PCTUSED參數(shù)::altertableemployeespctfree30pctused60;在表創(chuàng)創(chuàng)建之之后,,不能能再對對INITIAL存儲參參數(shù)進(jìn)進(jìn)行修修改,,但是是可以以修改改其他他的存存儲參參數(shù)。。altertableemployeesstorage(next512Kpctincrease0maxextentsunlimited);3.重建表表如果發(fā)發(fā)現(xiàn)一一個表表的數(shù)數(shù)據(jù)段段具有有不合合理的的區(qū)分分配方方式,,但是是又不不能通通過別別的方方法來來調(diào)整整(改改變存存儲參參數(shù)不不會影影響到到已經(jīng)經(jīng)分配配的區(qū)區(qū)),,可以以考慮慮將該該表移移到一一個新新的數(shù)數(shù)據(jù)段段中。。用戶戶可以以為新新的數(shù)數(shù)據(jù)段段重新新設(shè)置置存儲儲參數(shù)數(shù),以以便符符合表表的存存儲需需求。。比如,,利用用下面面的語語句可可以將將EMPLOYEES表移動動到同同一個個表空空間的的新數(shù)數(shù)據(jù)段段中::altertableemployeesmovestorage(initial20Knext40Kminextents2maxextents20pctincrease0);新的數(shù)數(shù)據(jù)段段可以以在原原來的的表空空間中中,也也可以以在其其他的的表空空間。。比如如,利利用下下面的的語句句可以以將EMPLOYEES表移動動到表表空間間USERS02的新數(shù)數(shù)據(jù)段段中::altertableemployeesmovetablespaceusers02storage(initial20Knext40Kminextents2maxextents20pctincrease0);4.手工分配和和釋放空間間默認(rèn)情況下下,Oracle會根據(jù)存儲儲參數(shù)設(shè)置置自動為表表分配區(qū)并并計(jì)算大小小。若需要要指定大小小的區(qū),則則可使用ALTERTABLEALLOCATEEXTENT語句以手工工方式為表表分配存儲儲空間。通過手工分分配區(qū),你你可指定區(qū)區(qū)的大小,,也可控制制將區(qū)分布布到哪個數(shù)數(shù)據(jù)文件上上。另外當(dāng)當(dāng)執(zhí)行SQL*loader裝載數(shù)據(jù)時時,如果表表段的空間間不足,則則會導(dǎo)致Oracle為表段動態(tài)態(tài)分配空間間,這樣會會降低數(shù)據(jù)據(jù)裝載速度度。為了避避免區(qū)的動動態(tài)分配,,應(yīng)該在執(zhí)執(zhí)行數(shù)據(jù)裝裝載操作前前手工為表表增加足夠夠大的區(qū)。。示例如下下:altertabledepartmentallocateextent(size500Kdatafile'e:\test\users2.dbf');使用ALTERTABLE命令不僅可可以為表段段分配空間間,也可以以釋放表上上多余的空空間。如果果表段實(shí)際際占用空間間多于所需需空間時,,你可以釋釋放其所占占用的多余余空間。語語法如下::ALTERTABLE[schema.]tableDEALLOCATEUNUSED[KEEPinteger[K|M]]KEEP指定在高水水位標(biāo)記((已經(jīng)使用用的存儲空空間和未使使用的存儲儲空間之間間的分界線線)以上應(yīng)應(yīng)該保留的的字節(jié)數(shù)。。如果使用上上述命令時時沒有KEEP子句句,Oracle將將回收高水水位標(biāo)記以以上所有未未使用空間間。如果高高水位標(biāo)記記所在的區(qū)區(qū)小于MINEXTENTS的值,則則Oracle釋放放MINEXTENTS以上上的區(qū),既既默認(rèn)情況況下釋放剩剩余空間后后表段的區(qū)區(qū)個數(shù)不會會低于MINEXTENTS,而如果果要釋放MINEXTENTS下面的的剩余空間間,需要帶帶有KEEP0選選項(xiàng)。示例例如下:altertabledepartmentdeallocateunused;5.分析表在Oracle中,,利用ANALYZE語句可可以對表、、索引和簇簇進(jìn)行分析析,通過分分析可以獲獲得關(guān)于指指定對象的的狀態(tài)和統(tǒng)統(tǒng)計(jì)信息,,并且能夠夠?qū)χ付▽ο蟮拇鎯Ω袷竭M(jìn)行行驗(yàn)證。驗(yàn)證表的存存儲結(jié)構(gòu)在ANALYZE語句中使用用VALIDATESTRUCTURE子句,可以以在分析過過程中對表表的存儲結(jié)結(jié)構(gòu)的完整整性進(jìn)行驗(yàn)驗(yàn)證。通過過存儲結(jié)構(gòu)構(gòu)的驗(yàn)證,,用戶可以以知道表中中是否存在在損壞的數(shù)數(shù)據(jù)塊。如如果有損壞壞的數(shù)據(jù)塊塊,則需刪刪除該表并并重建它。。在驗(yàn)證表的的存儲結(jié)構(gòu)構(gòu)時,Oracle會把表中中包含損壞壞數(shù)據(jù)塊的的記錄的ROWID插入到一一個名為INVALID_ROWS的的表中。對對EMPLOYEES表進(jìn)行行結(jié)構(gòu)驗(yàn)證證分析示例例如下:analyzetableemployeesvalidatestructure;然后可查詢詢INVALID_ROWS表看是否否有損壞的的數(shù)據(jù)塊。。收集表的統(tǒng)統(tǒng)計(jì)信息在ANALYZE語句中使用用COMPUTESTATISTICS子句或ESTIMATESTATISTICS子句可以收收集關(guān)于表表的物理存存儲結(jié)構(gòu)和和特性的統(tǒng)統(tǒng)計(jì)信息,,如表中記記錄的總數(shù)數(shù)和記錄鏈鏈接的總數(shù)數(shù),已使用用的數(shù)據(jù)塊塊總數(shù),未未使用的數(shù)數(shù)據(jù)塊總數(shù)數(shù),所有記記錄的平均均長度等。。比如,下下面語句對對EMPLOYEES表進(jìn)行精確確統(tǒng)計(jì)信息息:analyzetableemployeescomputestatistics;而利用下列列語句將通通過對200條記錄的分分析,獲得得對EMPLOYEES表的近似統(tǒng)統(tǒng)計(jì)信息::analyzetableemployeesestimatestatics;統(tǒng)計(jì)完后,,可查詢USER_TABLE、ALL_TABLE和DBA_TABLE數(shù)據(jù)字典視視圖來獲得得分析后的的統(tǒng)計(jì)信息息。查找表中的的鏈接記錄錄和遷移記記錄在ANALYZE語句中使用LISTCHAINED_ROWS子句,可以找找出表中的鏈鏈接記錄和遷遷移記錄。Oracle將把表中所有有鏈接記錄和和遷移記錄的的ROWID保存到一個名名為CHAINED_ROWS的表中。比如如,下面語句句對EMPLOYEES表進(jìn)行鏈接記記錄分析:analyzetableemployeeslistchained_rows;6.重命名表如果要修改表表的名稱,可可以使用RENAME語句對表進(jìn)行行重命名。用用戶只能對屬屬于自己模式式中的表進(jìn)行行重命名。renameemployeestoemp;7.1.4刪刪減表1.使用DELETE語句deletefromemployees;但是,用DELETE刪除記錄后,,Oracle不會回收為表表分配的存儲儲空間,也無無法手工回收收,甚至高水水位標(biāo)記也都都不會改變。。DELETE通常只來刪除除表中指定的的記錄,如果果刪除表中的的全部記錄,,一般用TRUNCATE或DROP語句。2.使用DROP語句DROP語句不僅刪除除了表中所有有的記錄,還還刪除了表結(jié)結(jié)構(gòu)。刪除表表一般是由表表的所有者來來完成的,如如果要以其他他用戶身份刪刪除表,則要要求該用戶必必須具有DROPANYTABLE系統(tǒng)權(quán)限,示示例如下:droptableemployeescascadeconstraints;其中,CASCADECONSTRAINTS選項(xiàng)用于指定定級聯(lián)刪除。。當(dāng)表與其他他表具有主外外鍵關(guān)系時,,刪除主表時時必須帶有該該選項(xiàng)。3.使用TRUNCATE語句當(dāng)表結(jié)構(gòu)必須須保留,但表表數(shù)據(jù)不再需需要時,可以以使用TRUNCATETABLE命令截?cái)啾?。。?dāng)執(zhí)行該命命令時,會刪刪除表的所有有數(shù)據(jù),并釋釋放表所占用用的空間,但但會保留表的的結(jié)構(gòu),具體體命令如下::truncatetableemployees;7.1.5顯示表的信息息1.顯示用戶所包包含的表通過查詢數(shù)據(jù)據(jù)字典DBA_TABLES、USER_TABLES可以取得表的的信息,其中中DBA_TABLES可用于顯示所所有用戶表的的信息,而USER_TABLES則可以顯示當(dāng)當(dāng)前用戶表的的信息,示例例如下:selecttable_namefromdba_tableswhereowner='DEVEP';2.顯示表的存儲儲參數(shù)設(shè)置當(dāng)建立表時,,可以指定表表段的存儲參參數(shù)、塊空間間使用參數(shù)、、并行度、日日志屬性以及及CACHE屬性等。通過過查詢數(shù)據(jù)字字典USER_TABLES,可以取得相相應(yīng)屬性信息息,示例如下下:selectpct_free,pct_used,degree,cachefromuser_tableswheretable_name='EMPLOYEES';3.顯示表段所在在表空間及尺尺寸當(dāng)建立表時,,Oracle會自動為表分分配相應(yīng)的表表段,表段的的名稱與表的的名稱完全一一致,并且該該表的所有數(shù)數(shù)據(jù)都會存放放在相應(yīng)表段段中。那么如如何取得段信信息呢?通過查詢數(shù)據(jù)據(jù)字典DBA_SEGMENTS或USER_SEGMENTS可以取得段信信息,其中DBA_SEGMENTS用于顯示數(shù)據(jù)據(jù)庫所有段的的信息,而USER_SEGMENTS則用于顯示當(dāng)當(dāng)前用戶段的的信息,示例例如下:selecttablespace_name,bytesfromuser_segmentswheresegment_name='DEPARTMENT';4.顯示表數(shù)據(jù)占占用的實(shí)際空空間以及剩余余空間當(dāng)建立表時,,Oracle會為表分配相相應(yīng)的表段。。當(dāng)在表上執(zhí)執(zhí)行INSERT操作時,Oracle會將數(shù)據(jù)放到到表段的相應(yīng)應(yīng)數(shù)據(jù)塊上。。那么如何取取得表數(shù)據(jù)占占用的實(shí)際空空間以及剩余余空間呢?通過查詢數(shù)據(jù)據(jù)字典USER_TABLES可以取得這些些信息,但查查詢之前必須須首先收集統(tǒng)統(tǒng)計(jì)。示例如如下:analyzetableempcomputestatics;selectblocks,empty_blocksfromuser_tableswheretable_name=‘‘EMP’;其中BLOCKS對應(yīng)于數(shù)據(jù)據(jù)已占用的的實(shí)際塊個個數(shù),而EMPTY_BLOCKS則對應(yīng)于剩剩余塊個數(shù)數(shù)。5.顯示區(qū)信息息當(dāng)建立表時時,Oracle會為表建立立相應(yīng)的表表段。段邏邏輯上又是是由一個或或多個區(qū)組組成的,而而區(qū)又是由由相鄰的數(shù)數(shù)據(jù)塊所組組成的,那那么如何確確定段包含含哪些區(qū),,以及區(qū)的的位置及尺尺寸呢?通過查詢數(shù)數(shù)據(jù)字典DBA_EXTENTS,可以顯示示區(qū)的詳細(xì)細(xì)信息,示示例如下::selectextent_id,file_id,block_id,blocksfromdba_extentswhereowner='DEVEP'andsegment_name='DEPT';其中,extent_id為區(qū)編號,,file_id為區(qū)所在文文件號,block_id為區(qū)的初始始數(shù)據(jù)塊號號,blocks為區(qū)所包含含的數(shù)據(jù)塊塊個數(shù)。6.顯示行所在在的實(shí)際位位置執(zhí)行INSERT操作時,服服務(wù)器進(jìn)程程會將數(shù)據(jù)據(jù)插入到表表段的相應(yīng)應(yīng)數(shù)據(jù)塊中中,并且Oracle會生成惟一一的ROWID對應(yīng)于該行行數(shù)據(jù)。但但用戶無法法直接讀懂懂ROWID,通過使用用DBMS_ROWID包可以顯示示行所在數(shù)數(shù)據(jù)文件、、數(shù)據(jù)塊位位置以及行行位置,如如下所示::selectdeptno,dname,dbms_rowid.rowid_relative_fno(ROWID)file#,dbms_rowid.rowid_block_number(ROWID)block#,dbms_rowid.rowid_row_number(ROWID)row#fromdept;7.2管理索引索引的作用用索引是與表表和簇相關(guān)關(guān)的一種數(shù)數(shù)據(jù)庫對象象,它的作作用類似于于書中的目目錄。在沒沒有目錄的的情況下,,要在書中中查找指定定的內(nèi)容必必須通讀全全書,而有有了目錄之之后,只需需要通過目目錄就可以以快速地找找到包含所所需內(nèi)容的的頁。合理理地使用索索引可以降降低磁盤I/O操作作次次數(shù)數(shù),,從從而而提提高高表表的的訪訪問問性性能能。。ROWID在empno列列上上無無索索引引在empno列列上上存存在在索索引引select*fromempwhereempno=7788假定定表表EMP數(shù)據(jù)據(jù)占占用用了了1000個數(shù)數(shù)據(jù)據(jù)塊塊,,如如果果在在EMPNO列上上不不存存在在索索引引,,那那么么當(dāng)當(dāng)執(zhí)執(zhí)行行““select*fromempwhereempno=7788”時時需需要要掃掃描描表表的的所所有有數(shù)數(shù)據(jù)據(jù)塊塊,,也也就就是是說說需需要要1000次I/O操作作;;如如果果在在EMPNO列上上存存在在索索引引,,并并假假定定索索引引層層次次為為2,那那么么當(dāng)當(dāng)執(zhí)執(zhí)行行““select*fromempwhereempno=7788”時時,,在在檢檢索索了了3個索索引引塊塊后后就就可可以以定定位位到到行行所所在在的的ROWID,然然后后根根據(jù)據(jù)ROWID可以以直直接接定定位位到到該該行行數(shù)數(shù)據(jù)據(jù),,也也就就是是說說只只需需要要4次I/O操作作。。顯顯然然,,使使用用索索引引可可以以大大大大提提高高查查詢詢速速度度。。2.索引引存存儲儲方方式式索引引與與表表一一樣樣,,不不僅僅需需要要在在數(shù)數(shù)據(jù)據(jù)字字典典中中保保存存索索引引的的定定義義,,還還需需要要在在表表空空間間中中為為它它分分配配實(shí)實(shí)際際的的存存儲儲空空間間。。當(dāng)當(dāng)創(chuàng)創(chuàng)建建索索引引時時,,Oracle會自自動動在在用用戶戶的的默默認(rèn)認(rèn)表表空空間間中中或或指指定定的的表表空空間間中中創(chuàng)創(chuàng)建建一一個個索索引引段段,,為為索索引引數(shù)數(shù)據(jù)據(jù)提提供供存存儲儲空空間間。。與與創(chuàng)創(chuàng)建建表表類類似似,,在在創(chuàng)創(chuàng)建建索索引引時時也也可可以以為為它它設(shè)設(shè)置置存存儲儲參參數(shù)數(shù)。。在創(chuàng)創(chuàng)建建索索引引時時,,Oracle首先先對對將將要要建建立立索索引引的的字字段段進(jìn)進(jìn)行行排排序序,,然然后后將將排排序序后后的的字字段段值值和和對對應(yīng)應(yīng)記記錄錄的的ROWID存儲儲在在索索引引段段中中((ROWID是數(shù)數(shù)據(jù)據(jù)庫庫的的偽偽列列,,用用于于存存儲儲一一個個行行標(biāo)標(biāo)識識符符))。。例例如如,,假假設(shè)設(shè)為為EMPLOYEES表中中的的ENAME字段段創(chuàng)創(chuàng)建建了了索索引引::createindexemp_enameonemployees(ename);則Oracle將先在在EMPLOYEES表中按按照ENAME字段進(jìn)進(jìn)行排排序((默認(rèn)認(rèn)為升升序排排序)),然然后按按照排排序后后的順順序?qū)NAME字段值和和對應(yīng)的的ROWID逐個保存存在索引引中。在索引創(chuàng)創(chuàng)建之后后,如果果執(zhí)行如如下的一一條查詢詢語句,,即在WHERE子句中引引用ENAME字段:selectename,salfromemployeeswhereename='JONES';那么Oracle將首先對對索引中中ENAME字段進(jìn)行行一次快快速搜索索,找到到符合條條件的ENAME字段值所所對應(yīng)的的ROWID,然后再再利用ROWID到EMPLOYEES表中提取取相應(yīng)的的記錄。。7.2.2建立索引引建立索引引使用CREATEINDEX命令。執(zhí)執(zhí)行該命命令的用用戶必須須具有CREATEINDEX系統(tǒng)權(quán)限限。如果果要在其其他用戶戶模式中中創(chuàng)建索索引,則則必須具具有CREATEANYINDEX系統(tǒng)權(quán)限限。常用的索索引類型型有B*樹索引引、位圖圖索引、、反向索索引、函函數(shù)索引引等。1.建立B*樹索引B*樹索引是是最常用用的索引引,在使使用CREATEINDEX語句創(chuàng)建建索引時時,默認(rèn)認(rèn)方式下下將建立立B*樹索引。。B*樹索引是是以根塊塊、分支支塊、葉葉塊來組組織和存存放索引引數(shù)據(jù)的的,在B*樹的葉節(jié)節(jié)點(diǎn)中存存儲索引引字段的的值與ROWID。根塊<KINGKING分支塊塊塊KINGMILLERTURNER<BLAKEBLAKEJAMES葉塊TURNERWARDMILLERSCOTTSMITHKINGMARTENJAMESJONESBLAKECLARKFORDADAMSALLENBLAKEROWIDCLARKROWIDFORDROWIDB*樹索引適適用于那那些具有有高基數(shù)數(shù)的字段段,即大大部分值值都不相相同的字字段。創(chuàng)創(chuàng)建B*樹索引引的語法法如下::CREATE[UNIQUE]INDEX[schema.]indexON[schema.]table(column[ASC|DESC][,column[ASC|DESC]]…)[TABLESPACEtablespace][PCTFREEinteger][INITRANSinteger][MAXTRANSinteger][storage-clause][LOGGING|NOLOGGING][NOSORT]TABLESPACE:用于于指定索索引段所所在表空空間。PCTFREE:用于于指定為為將來INSERT操操作所預(yù)預(yù)留的百百分比。。若指定定PCTFREE為0,則則可能會會導(dǎo)致索索引數(shù)據(jù)據(jù)占滿某某些索引引葉塊。。INITRANS:指指定每個個塊中預(yù)預(yù)先分配配的事務(wù)務(wù)項(xiàng)的數(shù)數(shù)目。MAXTRANS:限限制分配配給每塊塊的事務(wù)務(wù)項(xiàng)的數(shù)數(shù)目。storage-clause:用用于指定定索引段段存儲參參數(shù)。LOGGING、NOLOGGING:是是否在重重做日志志中記錄錄創(chuàng)建索索引的操操作和在在索引上上進(jìn)行的的后續(xù)操操作。NOSORT:指定行行按升序序存儲在在數(shù)據(jù)庫庫中,這這樣,Oracle在創(chuàng)建索索引時就就不必對對行進(jìn)行行排序。。注意:創(chuàng)創(chuàng)建索引引的時候候,不能能使用pctused參數(shù),因因?yàn)閯h除除索引時時,只是是邏輯刪刪除,其其物理空空間沒有有釋放。。如果在WHERE子句中經(jīng)常常要引用某某列,那么么你可以基基于該列建建立B*樹索引。例例如,如果果在應(yīng)用中中經(jīng)常要執(zhí)執(zhí)行類似于于“SELECT*FROMempWHEREename=‘SCOTT’’”查詢語句句,那么你你可以基于于ENAME列建立B*樹索引。建建立B*樹索引的示示例如下::createindexind_enameonemp(ename)pctfree30storage(initial100Knext100Kpctincrease0minextents2maxextents50)tablespaceindx;當(dāng)建立了B*樹索引之后后,如果在在WHERE子句中包含含有索引列列,如:SELECT*FROMempWHEREename='SCOTT',那么Oracle會自動使用用索引定位位行數(shù)據(jù),,從而降低低I/O操作次數(shù),,最終提高高數(shù)據(jù)訪問問速度。2.建立位圖索索引位圖索引不不同于B*樹索引,它它不是以((索引字段段值,ROWID)的方式來來存儲索引引信息的,,而是為每每個唯一的的索引字段段值建立一一個位圖,,在這個位位圖中使用用一個位元元(Bit,取值為0或1)來對應(yīng)一一條記錄的的ROWID。如果該位位元為1,說明與該該位元對應(yīng)應(yīng)的ROWID是一條包含含該位圖的的索引字段段值的記錄錄。位元到到ROWID的對應(yīng)關(guān)系系通過位圖圖索引中的的映射函數(shù)數(shù)來完成。。創(chuàng)建位圖索索引的語法法如下:CREATEBITMAPINDEX[schema.]indexON[schema.]table(column[ASC|DESC][,column[ASC|DESC]]…)[TABLESPACEtablespace][PCTFREEinteger][INITRANSinteger][MAXTRANSinteger][storage-clause][LOGGING|NOLOGGING][NOSORT]假定表CUSTOMER包含有1000萬條記錄,,該表使用用REGION列表示客戶戶所在方位位,并且將將來經(jīng)常需需要引用REGION列進(jìn)行數(shù)據(jù)據(jù)統(tǒng)計(jì)。CUSTOMER表的部分內(nèi)內(nèi)容如下所所示:CUSTOMER_IDMARITAL_STATUSREGIONGENDERSALARY101SingleEastMale1000102MarriedCentralFemale1200103MarriedWestFemale8500104DivorcedWestMale1200105SingleCentralFemale750

溫馨提示

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

最新文檔

評論

0/150

提交評論