Oracle企業資產管理_第1頁
Oracle企業資產管理_第2頁
Oracle企業資產管理_第3頁
Oracle企業資產管理_第4頁
Oracle企業資產管理_第5頁
已閱讀5頁,還剩135頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

1.表結構

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

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

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

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

NUMBER(P,S)該數據類型用于定義數字類型的數據,其中P是精度,表示數字的總位數,而S是刻度范圍,表示小數點后的位數。精度和刻度范圍都是可選的,但若指定了刻度范圍,那么必須指定精度。假定定義SAL列為NUMBER(4,3),若該列的數據為123.4567,則存儲錯誤,因為超出了精度范圍;若該列的數據為1.234567,則實際存儲的數據為1.235,因為當被指派值超出了刻度范圍時,存儲值按照刻度范圍指定的數字位的位數進行舍入。另外,定義整數還可以直接使用INT數據類型。

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

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

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

其中:CLOB和LONG用于存儲大型的、固定寬度字符數據;BLOB和LONGRAW用于存儲非結構化數據,如二進制圖象;NCLOB用于存儲大型的、固定寬度字符集數據;BFILE用于存儲操作系統文件中的非結構化數據。

3.數據的存儲方式當創建表時,Oracle會自動從指定的表空間中為新建的表創建一個數據段,而該表的所有數據都會存放到相應的表段中。

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

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

OOOOOOFFFBBBBBBRRR數據對象號

相對文件號

數據塊號

行號

數據對象號:表的惟一對象標識號。當建立表時,Oracle會為該表分配惟一的數據對象號。相對文件號:表空間內數據文件的惟一標識號。塊號:行所在數據塊的位置。

行號:行在塊內的位置。

因為創建了一個表就創建了一個段,而一個段只能駐留在一個表空間中,所以使用數據對象編號,Oracle服務器可以確定表所在的表空間;又因為表空間的數據都存放在數據文件中,使用相對文件編號Oracle可以確定存放表數據的數據文件;數據文件用數據塊來存儲數據,使用數據塊編號可知表的某一行數據存放在哪個數據塊中;而一個數據塊可能存放多行數據,利用行號就可以定位表中的任一行了。

ROWID是表的偽列,用戶在查看表的結構時不會看到ROWID字段,但和其它字段一樣,可以在執行SELECT操作時直接引用。但是因為用戶無法直接讀懂ROWID內容,所以在引用ROWID時通常使用DBMS_ROWID將其轉變為可讀取的內容。

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

溫馨提示

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

評論

0/150

提交評論