dbms_metadata.get_ddl( )方法查询建表语句及查询结果解析
dbms_metadata.get_ddl( )方法查詢建表語句及查詢結果解析
當我們想要查看某個表或者是表空間的DDL的時候,可以利用dbms_metadata.get_ddl這個包來查看。
dbms_metadata包中的get_ddl函數詳細參數
GET_DDL函數返回創建對象的原數據的DDL語句,詳細參數如下
– object_type —需要返回原數據的DDL語句的對象類型
– name — 對象名稱
– schema —對象所在的Schema,默認為當前用戶所在所Schema
– version —對象原數據的版本
– model —原數據的類型默認為Oracle
– transform. - XSL-T transform. to be applied.
– RETURNS: 對象的原數據默認以CLOB類型返回
dbms_metadata包中的get_ddl函數定義
FUNCTION get_ddl ( object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT ‘COMPATIBLE’,
model IN VARCHAR2 DEFAULT ‘ORACLE’,
transform. IN VARCHAR2 DEFAULT ‘DDL’) RETURN CLOB;
通過dbms_metadata.get_ddl()方法查詢后,得到查詢對象的DDL語句,如下的表查詢語句及查詢結果。
-- 查詢TABLE SELECT table_name,DBMS_METADATA.GET_DDL('TABLE',table_name) FROM user_tables; --查詢結果 CREATE TABLE "SCOTT"."DEPT" ( "DEPTNO" NUMBER(2,0),"DNAME" VARCHAR2(14),"LOC" VARCHAR2(13),CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USERS" ENABLE )SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS"查詢結果解析如下:
1. PCTFREE
PCTFREE:為數據更新準備的“留白”,即為一個塊保留的空間百分比。
?向一個數據庫寫入數據時,對數據表中的塊block來說,數據會依次填滿數據塊,在Oracle中,向數據庫寫數據的時候,需要先找到一個空閑塊,之后向空閑塊中寫入數據。
Oracle是怎樣判斷一個塊是空閑塊?
? 答案就是 PCTFREE 參數。該參數是一個百分比值,它的默認為10%。如果一個數據塊的空閑空間(可用空間)低于 PCTFREE 設定值,就認為這個數據塊已經寫滿。會將這個塊從空閑塊的列表(FREELIST)上刪除。
為什么要設置這個參數?或者說這個參數的意義在哪?
數據在插入后,可能會進行update操作,這個參數意義就在這。數據保存在數據行里,隨著不斷的更新,每行所占有的空間是一個不定的范圍。在數據插入之后,可能會發生存儲空間增加(比如:varchar2類型字符長度變化),這個參數的設置值(默認10%)就是為了應對這個問題,留作數據行空間延展使用。
萬一數據延伸超過10%該怎么辦?
? Oracle定位數據使用的物理rowid機制,實際上就是定位特定的數據行在某個數據塊的第幾個slot(槽)上。如果一個數據塊再也裝不下一些數據行,那么這些數據行就需要另找一個新的數據塊進行保存。也就意味著這些行有一個新的new-rowid位置。但是,Oracle還會按照原來的old-rowid定位數據行。原來的數據塊上,記錄著該數據行的新位置new-rowid,再次找到新的數據行位置。這個技術過程就稱為行遷移(row migrate) 。
注意:我們要讀一個數據行的內容。理論上希望訪問的數據塊越少越好,最好只有一個塊。但是,如果發生行遷移,我們就不得不訪問多個數據塊才能得到數據。所以,我們要盡量避免發生行遷移的情況出現,最好的辦法就是保留一個適當的PCTFREE值。
通俗說法:
? PCTFREE 后面的值是一個百分比,當數據塊小于這個百分比時可以 insert 數據,這個時候又被稱為上升期,當數據塊大于這個百分比時只能 update 數據。它的值是為了防止數據空間延伸超過空間塊兒出現行遷移的現象而存在的。
2. PCTUSED
PCTUSED :數據塊的判定容量底線,指當塊里的數據低于多少百分比時,又可以重新被insert,一般默認是40,即40%,即:當數據低于40%時,又可以寫入新的數據,這個時候處在下降期。
Oracle可以插入數據,也可以刪除數據,當一個塊中的數據刪除到一定程度時,Oracle又會認為這個塊是空閑塊。這個程度的設定值就是PCTUSED 。
當一個數據塊的使用容量低于PCTUSED設置的限制,那么就認為這個數據塊已經空閑,可以放置回FREELIST列表中,作為空閑數據塊接受新數據行的插入。
? 在一般而言,40%是可以接受的,如果PCTUSED 和 PCTFREE 值設置的太過于接近,則會導致頻繁的數據塊空閑或者寫滿切換,這樣有損于數據庫性能。而對于一些數據變化巨大、刪除頻繁的系統,這個參數可以配合PCTFREE 統一籌劃。
? 11gR2默認是使用segment creation deferred建立,即新建的空表不分配segment,當insert第一條記錄時分配段空間,不會因truncate而回收,并且在sys schema里不支持,exp也不會導出。
3. INITRANS 和 MAXTRANS
INITRANS:設置初始事務
MAXTRANS :設置最大事務
?事務是數據塊級別的參數。數據庫事務的本質還是對數據塊的修改,而事務的信息是記錄在數據塊頭。
參數INITRANS就是表示數據塊上可以標記的初始事務數目。如果同時進行的事務數據量超過這個數量,事務數目可以增加,最大能夠達到MAXTRANS 的限制。
?從性能角度看,我們不希望一個數據塊同時進行過多的事務。因為這樣起碼意味著數據塊過熱。所以,建議設置一個合理的INITRANS。
4.NOCOMPRESS 和COMPRESS
Compress:壓縮參數
nocompress:不壓縮,一般默認為 nocompress。
?Compress參數含義:在存儲表數據的時候是否啟用壓縮選項。壓縮使用的級別是數據塊block級別。Oracle對數據塊的壓縮采用相鄰相同值合并的壓縮算法。
Compress參數有兩個系列參數:
?(1)OMPRESS FOR DIRECT_LOAD OPERATIONS:作用于Compress相同,適合于數據倉庫OLAP系統。只在直接插入過程中在表或者分區上啟用壓縮技術;(2)COMPRESS FOR ALL OPERATIONS:適合于OLTP系統,針對所有的操作均啟用了壓縮選項。要求的版本較高。
壓縮表數據該如何選擇?
? 表改動很小的或者幾乎不改動的情況下使用compress,節省空間,提高查詢的性能,
? 經常改變的表不要使用壓縮(nocompress),不然會使表的更新和插入操作變慢。
5. LOGGING 和 NOLOGGING
LOGGING :寫入日志
NOLOGGING 表示不寫入日志
Nologging對表的某些特定操作不寫入redo log, 如 insert /+ APPEND/直接插入,create table as select ……
這樣做可以減少日志的生成量,加快記錄的插入。但平時表的insert,update,delete 還是會寫入redo log的
6. STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
在storage關鍵字里,包括了存儲上對數據對象空間分配的一些重要參數。
其中的核心內容控制了Oracle如何給這個數據表對象分配空間。
先闡明一個概念:數據表空間Tablespace空間管理的機制問題
?storage關鍵字里面涉及到參數取值通常來自我們使用表空間的設置。數據表邏輯上是一種段對象segment object(Data Segment)。Data Segment的空間管理是通過Tablespace表空間進行管理的。
? 在管理空閑空間和分配空間的問題上,有字典管理方式(Dictionary Management Tablespace DMT)和本地管理方式(Locally Management Tablespace LMT)。(聲明:本部分參考陳吉平老師的《Oracle——高可用環境》)
? 在Oracle8i以前,對空閑空間是采用數據字典DML的方式進行管理。兩個底層數據字典UET ( 已 經 使 用 過 的 空 間 ) 和 F E T (已經使用過的空間)和FET (已經使用過的空間)和FET(未使用的空間)。當分配空間的時候,Oracle使用一系列遞歸的SQL來獲取空閑空間。這種結構存在一些潛藏的問題。是并行操作引起的性能瓶頸。在尋找空間空間和分配空間的時候,Oracle對兩個數據字典表進行遞歸SQL調用和更新。在DML操作頻繁、空間分配管理的環境下,數據字典進行串行化操作,容易形成性能瓶頸。配合其他參數進行空間分配,容易形成過多的空間碎片。特別是在分配大小不一致的情況下。每個Segment所使用的所有extents信息都保存在數據字典中,如果數據表很大,字典數據表中記錄數目也就相對較多。那么,進行批量的刪除或者數據表drop,會引起長時間的數據表更新操作。長時間的串行化更新操作進一步就會影響系統整體的空間管理分配能力。
? 鑒于這些問題,Oracle在8i之后,推出了本地管理表空間(LMT)機制,逐漸取代DMT方法。簡單的說,就是將空閑空間管理職責,由統一的數據字典管理下放到文件級別,讓文件自己管理空閑空間、分配空間。
? 在LMT機制里,Oracle將存儲信息保存在文件的文件頭部。在文件頭上,存在一個位圖形式的存儲信息段,其中記錄了該文件空閑空間管理信息。這樣,在表空間進行對象空間分配的時候,只需要進行文件級別的資源協調,不需要訪問專門的數據字典。這樣也就避免了空閑資源帶來的爭用。
① initial參數
initial:在創建這個對象(數據表)時,分配多大的空間。也就是初始段segment大小
在我們提取出的數據表信息中,initial參數設置為65536。系統的塊為8K,也就是81024=8192byte空間。initial為88K,也就是說,初始段空間分配8個數據塊,也就是64KB。
雖然initial參數是DMT時代確定的參數選項,但是在LMT機制下該參數依然有效,而且是必需的。Oracle是不能確定初始段空間大小。
② next參數
next:分配下一個空間片段的大小
在LMT進行表空間管理下,NEXT參數子句是過時的。在代碼例子中,next=1048576,為1MB空間。
為了消除存儲中的碎片現象,目前我們都是通過設置統一大小uniform. size的extent空間。也就是每個分區的大小都是一致的。
③ Minextents和Maxextents參數
Minextents:數據對象在創建開始分配分區的個數
Maxextents:最大可分配分區的個數信息
7. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
①FREELISTS 和 Freelist Group
? FREELISTS和FREELIST-GROUPS參數是段的存儲參數。
? 數據庫在INSERT,UPDATE操作時都需要請求空閑的數據塊,由于不可能每次操作時都去每個數據塊查詢一下看看有沒有空閑的塊(如果這樣那效率太低了)。為了解決這個問題,ORACLE的在每個段的段頭有一個空閑數據塊指針鏈表的結構,這個就稱為FREELISTS,FREELISTS列表代表鏈表的長度。表面上看像解決了問題,但在高并發對一個表的插入或更新時,一個空閑鏈表往往會出現等待的現象,所以為了提高性能,又增加了多個空閑鏈表的處理,也就是FREELIST-GROUPS,也就說段有多少個空閑鏈表是FREELIST-GROUPS參數決定。
? 在ORACLE9.2以前,對于一些高并發的表需要檢查FREELISTS和FREELIST-GROUPS參數是否滿足應用的要求。從ORACLE9.2新增加了ASSM(表空間段自動管理)的新特性,有了ASSM,鏈接列表FREELISTS被位圖結構所取代,所以也根本不需要指定什么FREELISTS和FREELIST-GROUPS參數了,一個段里哪些數據塊是空閑的,那些是可以再使用的,在這個位圖里全部可以取到,并且全部是由ORACLE自動管理。
通過測試與實踐,采用自動段管理的表,在并發處理性能上表現非常好,所以基本上現在的表都采用段自動管理了,因此FREELISTS和FREELIST-GROUPS參數也就成為過去。
Freelists與Freelist Group都是涉及到段對象空間分配的機制。分配給數據段的空閑空間包括兩個部分,高水位線HWM以上空閑塊和HWM以下空閑塊。
其中,HWM以下的空閑空間是通過Freelists進行管理。簡單的說,Freelists就是一個列表,列表上連接著所有管理的空閑數據塊。當進行insert或者update操作的時候,數據表段segment需要額外的空閑數據塊,就需要段segment進行空閑塊的管理。
在這個過程中,每個段頭上都有專門的freelists,進行空閑塊的管理。freelists參數就表示附加在這個段對象上處理freelist的個數,也就是一個freelists group上所容納的freelists的個數。
在案例參數中,取定freelists=1,表示該數據表中每個freelists group上包括一個freelists。該參數的最小值為1,最大值的選取與當前數據庫使用數據塊大小db_block_size密切相關。如果設置不合適,會在運行階段報錯。
使用freelist的時候,當系統需要空閑塊保存數據是,會向freelist進行空間請求,容易成為性能的瓶頸所在。所以從9i開始,Oracle引入了位圖表進行freelist的管理。
指定創建數據對象上使用的Freelist Group的數量。我們說,默認情況下,是使用一個freelist進行數據空閑塊管理。一些數據表如果分配比較頻繁,單個freelist可能不能滿足實際的需要,這時候可以考慮使用多個freelist group來緩解空間塊管理壓力。
說明: 對表空間空間的管理,Oracle存在手工段管理方式下Segment Management Manual。如果設置為自動段空間管理ASSM下,freelists和freelist group兩個參數是不起效果的。
②Buffer_POOL參數
Buffer_Pool:決定了該數據段對象在SGA緩沖區中的管理策略。
Oracle是不會直接對數據文件中的數據進行操作的。對數據的讀寫操作,都是需要對文件以數據塊的形式加載在內存SGA共享區中,之后對數據塊進行操作。如果是修改或者新增加操作,則由DBWn后臺進行寫回數據文件。
數據塊在SGA區中駐留的場所就是Buffer Pool。Oracle在訪問一條數據的時候,首先會在Buffer Pool中尋找,看看該塊是不是已經緩存在Buffer Pool中了。如果沒有,就從數據文件中獲取這個數據塊。長期DBA們關注的數據塊命中率,也就是在Buffer Pool中發生的。
一般內存是小于數據庫容量的。為了加快速度,最理想的情況是將所有的數據加載在內存中。但是這種方法還存在一些距離。所以,總會有數據塊被從Buffer Pool中替換掉。目前Oracle采用LRU算法進行數據塊淘汰,也就是最常用、訪問最頻繁的數據塊會更長時間保存在緩沖區內,很少訪問的數據塊可能很快的被剔出緩沖區。這樣做的目的也就是保證經常訪問數據訪問速度。
在這樣的基礎上,Oracle對Buffer Pool進行了進一步的劃分。劃分為keep、default和recycle三個子池,這樣的劃分目的是在業務范疇上對數據進行進一步的分治。
? keep池的含義就是保持最長的時間。keep池中的對象,都是定義為經常使用的對象,保持最大限度的駐留時間。不會輕易被剔出Buffer Cache;
? recycle池是為了不經常訪問的數據對象塊準備的。通常被加載之后,不希望長時間的保存。
default
?default是buffer pool的默認選項,是介于keep和recycle兩類之間的一種對象緩存方式。
要說明的是兩點:
1、三種類型池對象雖然目的定義不同,但是使用的管理算法仍然是LRU算法。區別只是在從業務上對數據對象進行劃分,而這個定義是掌握在系統設計和DBA手中;
2、當我們對SGA空間進行動態管理的時候,三個緩存池空間是通過Oracle動態進行調整的。所以,我們現在已經不需要分別定義空間的大小,而只需要定義三類對象是什么就可以了。
回到buffer_pool參數,經過了上面的說明。buffer_pool的含義也就比較清楚了。Buffer_pool定義了該段對象進行緩存的策略。取值有default、keep和recycle。
TABLESPACE “EAS_D_GYCS_TEMP2” ;
–表示用EAS_D_GYCS_TEMP2表空間
總結
以上是生活随笔為你收集整理的dbms_metadata.get_ddl( )方法查询建表语句及查询结果解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC---上下文菜单(快捷菜单)管理器
- 下一篇: unity3D出现Unhandled E