熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

初學者必讀:行連接和行遷移的不同之處

2022-06-13   來源: Oracle 

  【實驗室-技術報道】兩者之間的區別

  行連接是指一個行存儲在多個塊中的情況因為一個該行的長度超過了一個塊的可用空間大小

  行遷移是指一個數據行不適合放入當前塊而被重新定位到另一個塊但在原始塊中保留一個指針原始塊中的指針是必需的因為索引的rowid項仍然指向原始位置

  行連接通常與行的長度和oracle數據庫塊中的大小有關而行遷移通常是當一個更新操作的長度增加且又要保持該行在同一塊中而該塊又缺少可用空間時產生的問題oracle在決定行連接之前先試圖進行行遷移

  

  檢查是否存在行遷移或是連接

  ()ANALYZE TABLE order_hist LIST CHAINED ROWS;

  ()SELECT * FROM CHAINED_ROWS WHERE TABLE_NAME = ORDER_HIST;

  OWNER_NAME TABLE_NAME CLUST HEAD_ROWID TIMESTAMP

  

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAA MAR

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAB MAR

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAC MAR

  

  

  貼個document i裡面的資料說得比較詳細:

  

  Listing Chained Rows of Tables and Clusters

  You can look at the chained and migrated rows of a table or cluster using the ANALYZE statement with the LIST CHAINED ROWS

  

  clause The results of this statement are stored in a specified table created explicitly to accept the information returned

  

  by the LIST CHAINED ROWS clause These results are useful in determining whether you have enough room for updates to rows

  

  For example this information can show whether PCTFREE is set appropriately for the table or cluster

  

  Creating a CHAINED_ROWS Table

  To create the table to accept data returned by an ANALYZE LIST CHAINED ROWS statement execute the UTLCHAINSQL or

  

  UTLCHNSQL scrīpt These scrīpts are provided by Oracle They create a table named CHAINED_ROWS in the schema of the user

  

  submitting the scrīpt

  

  

  

  Note:

  Your choice of scrīpt to execute for creating the CHAINED_ROWS table is dependent upon the compatibility level of your

  

  database and the type of table you are analyzing See the Oraclei SQL Reference for more information

  

  

  

  

  After a CHAINED_ROWS table is created you specify it in the INTO clause of the ANALYZE statement For example the following

  

  statement inserts rows containing information about the chained rows in the emp_dept cluster into the CHAINED_ROWS table:

  

  ANALYZE CLUSTER emp_dept LIST CHAINED ROWS INTO CHAINED_ROWS;

  

  See Also:

  Oraclei Database Reference for a descrīption of the CHAINED_ROWS table

  

  

  Eliminating Migrated or Chained Rows in a Table

  You can use the information in the CHAINED_ROWS table to reduce or eliminate migrated and chained rows in an existing table

  

  Use the following procedure

  

  Use the ANALYZE statement to collect information about migrated and chained rows

  ANALYZE TABLE order_hist LIST CHAINED ROWS;

  

  

  Query the output table:

  SELECT *

  FROM CHAINED_ROWS

  WHERE TABLE_NAME = ORDER_HIST;

  

  OWNER_NAME TABLE_NAME CLUST HEAD_ROWID TIMESTAMP

  

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAA MAR

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAB MAR

  SCOTT ORDER_HIST AAAAluAAHAAAAAAAC MAR

  

  

  The output lists all rows that are either migrated or chained

  

  If the output table shows that you have many migrated or chained rows then you can eliminate migrated rows by continuing

  

  through the following steps:

  Create an intermediate table with the same columns as the existing table to hold the migrated and chained rows:

  CREATE TABLE int_order_hist

  AS SELECT *

  FROM order_hist

  WHERE ROWID IN

  (SELECT HEAD_ROWID

  FROM CHAINED_ROWS

  WHERE TABLE_NAME = ORDER_HIST);

  

  

  Delete the migrated and chained rows from the existing table:

  DELETE FROM order_hist

  WHERE ROWID IN

  (SELECT HEAD_ROWID

  FROM CHAINED_ROWS

  WHERE TABLE_NAME = ORDER_HIST);

  

  

  Insert the rows of the intermediate table into the existing table:

  INSERT INTO order_hist

  SELECT *

  FROM int_order_hist;

  

  

  Drop the intermediate table:

  DROP TABLE int_order_history;

  

  

  Delete the information collected in step from the output table:

  DELETE FROM CHAINED_ROWS

  WHERE TABLE_NAME = ORDER_HIST;

  

  

  Use the ANALYZE statement again and query the output table

  Any rows that appear in the output table are chained You can eliminate chained rows only by increasing your data block size

  

  It might not be possible to avoid chaining in all situations Chaining is often unavoidable with tables that have a LONG

  

  column or long CHAR or VARCHAR columns 配置數據存儲

  

  數據庫管理員面對的一個最常見的問題就是處理數據庫對象的碎片碎片浪費空間導致性能問題並給數據庫對象的管理帶來更大的困難事實上數據庫碎片是許多問題而不是一個問題包括分裂成碎片的數據庫對象分裂成碎片的表空間連接行和轉移行

  

  數據庫碎片通常是行被插入修改和刪除以及對象被建立和刪除的結果

  

  

  

  分裂成碎片的表空間

  

  表空間變成碎片是由於錯誤以及表空間中的數據庫對象的無計劃撤銷和重建造成的

  

  表空間碎片會導致下面的問題

  

  ◆表空間中的空間被分離且不能有效地使用

  

  ◆在需要重建分裂成碎片的對象會導致管理問題

  

  

  

  避免數據字典的碎片

  

  數據字典是放在SYSTEM表空間中的所以就需要將用戶的默認表空間和/或臨時表空間更改為非SYSTEM表空間語法如下

  

  ALTER USER username DEFAULT USERS TEMPORARY TEMP;

  

  

  

  處理分裂成碎片的表空間

  

  處理表空間碎片的最好方法是避免它如果面臨著整理分裂成碎片的表空間最簡單的方法是在表空間中導出損壞了的對象刪除該對象再把他們導入回來

  

  要避免碎片有以下幾種方法

  

  把對象用相似的空間和增長特性聚合在一起

  

  如果可能把它們的區間設成相同的容量這樣所有的對象可以共享釋放或者從刪除對象中回收的區間

  

  使每個段的PCTINCREASE保持為

  

  

  

  聚集可用空間的技術

  

  可用空間的聚集是通過將多個鄰接的可用區變為一個較大的可用區來排除蜂窩式可用空間碎片的一個過程

  

  以下技術可用來聚集可用空間

  

  方法直接聚集(使用此方法定期在有碎片的表空間中聚集可用空間)

  

  可以使用ALTER TABLESPACE COALESCE命令

  

  方法後台SMON聚集(應避免使用此方法)

  

  如果一個表空間的PCTINCREASE數據存儲參數的值大於零則後台實例進程SMON將擔當間接聚集該表空間的可用區的任務避免使用的理由

  

  首先PCTINCREASE設為非零值將導致空間碎塊的增加

  

  其次它引起SMON的不必要的性能開銷

  

  再次SMON本身在聚集可用空間方面效率並不高

  

  如果想要一個自動的過程可以建立一個命令腳本通過計劃任務來執行

  

  方法利用時間聚集空間(已過時)

  

  方法請求式聚集(由Oracle服務器內部使用)

  

  

  

  查找接近MAXEXTENTS值的對象

  

  段及其區的信息可以從數據字典視圖DBA_SEGMENTS和DBA_EXTENTS中找到

  

  可以使用導出和導入實用程序將分成大量小區的對象重組到一個單獨的大區中如果遍布在該數據庫中的大量的對象都受到影響可以使用全數據庫重組功能來重新組織整個數據庫的空間並重新創建每個表或索引到單獨的區中

  

  在Oraclei中ALTER TABLE命令的MOVE通過將為分區的表的數據重新定位到一個新的段中並修改它的存儲性來整理表的碎片

  

  

  

  對象碎片

  

  對象碎片會導致下面的問題

  

  對數據庫額外的讀調用會導致響應時間增加

  

  由於在表和索引塊中的自由空間空洞導致空間的浪費

  

  讀性能下降因為數據不再被緊緊地排在一起物理磁盤驅動器必須從一個必須要的大的磁盤表面區域中搜尋和讀數據

  

  

  

  行轉移

  

  行轉移在對行的修改引起行的長度比塊中可利用空間大時發生這時會在原來的塊中存放一個指針指向新的塊但是這樣存在兩個問題

  

  Oracle每次必須執行至少一次額外的輸入/輸出讀來獲取轉移的行

  

  Oracle也必須和行數據一起存儲額外的指針來共給行轉移機制

  

  

  

  行連接

  

  行連接在一個行太長以至於不能放入任何一個數據塊時發生這導致該行被存儲在一個或多個數據塊的鏈中行連接經常伴隨著包含LONGLONGRAW或者LOB數據類型的大行發生

  

  

  

  使行連接和行遷移最小化

  

  通常一行應該完全安放在一個單一的Oracle數據塊中行連接和行遷移是兩種異常情況即一行與多個數據塊有關當一行太大以致於不能適合任何數據塊時就發生行連接

  

  行連接和行遷移都是不希望的情形應盡量避免由於在多個數據塊中分布數據存儲的行連接和行遷移將導致更大的I/O開銷從而降低性能 消除連接和轉移的行

  

  通過執行下面的步驟消除所有轉移行

  

  ()使用如下的SQL語句建立一個臨時表來保存轉移行

  

  CREATE TABLE temp_emp as

  

  SELECT * FROM emp WHERE rowed in

  

  (SELECT rowed FROM chained_rows WHERE table_name=EMP)

  

  ()從主表中刪除前一語句存儲的行

  

  DELETE FROM emp WHERE rowed_in

  

  (SELECT head_rowed FROM chained_rows

  

  WHERE table_name=EMP)

  

  ()從臨時表中插入行

  

  INSERT INTO emp SELECT * FROM temp_emp;

  

  這種方法的缺點

  

  表中的許多自由空間可能永遠都沒用過這取決於PCTUSED的設置因此空間被浪費了

  

  當這個表通過全表掃描被讀取時因為必須讀非常大量的塊所以可能會損失一些性能

  

  在盡力避免行轉移時確定PCTFREE的值很重要

  

  行連接是非常難調整的唯一的解決辦法是縮短表的行長或者增加數據塊的大小選擇遷移中方法通常需要對表結構進行重新設計但是後一種方法需要導出整個數據庫重新創建然後全部導入這兩種方法都不是很吸引人但是如果一個表中的連接行引起了性能問題那麼就必須使用它們

  

  

  

  行連接/行遷移的技巧

  

  行連接和行遷移的技巧包括如下方面

  

  行連接一旦出現只要不用較大的數據塊尺寸重建數據庫就不能糾正

  

  處理行連接的最好的方法就是防止它的出現

  

  已開始就用大數據塊尺寸創建數據庫將有助於防止行連接只要最大尺寸的行不超過該數據塊的大小就行數據塊的大小對數據庫性能有顯著的影響應該根據各種情形來取定

  

  與行連接不同行遷移更容易防止和產生

  

  經歷過繁重更新活動的數據段最容易產生行遷移

  

  為STORAGE子句的參數PCTFREE指定的值對行遷移有很大的影響正確地設置該參數可以防止或至少可以使行遷移最小化

  

  使用ANALYZE命令方法或通過查詢V$SYSSTAT視圖可以經常檢查更新活動頻繁的表以便及時發現行遷移 避免區出超錯誤

  

  段能夠得到的區的最大數由MAXEXTENTS數據存儲參數決定如果段得到了所允許的區的最大值當Oracle試圖再分配區時會返回錯誤有兩種方法可以主動防止區錯誤

  

  將對象的MAXEXTENTS設置為UNLIMITED如果空間允許的話應為INITIAL和NEXT考慮大一點的估計值以防止對象由於獲得過多的小區而產生碎片

  

  如果MAXEXTENTS不設為UNLIMITED則應定期檢查接近最大區數量的段可以從DBA_SEGMENTS視圖中找到對於接近其MAXEXTENTS限制值的對象可以隨意選擇使用以下任一個或所有操作(a)增加該段的MAXEXTENTS(b)增加NEXT區的大小(c)將該對象重組到一個單獨的區中

  

  

  

  避免空間出超錯誤

  

  當由於表空間的可用空間匮乏而Oracle不能將一個區分配給對象時會出現空間的出超(outofspace)錯誤采用以下一種或兩種方法可以防止這些錯誤

  

  將AUTOEXTEND設為ON

  

  進行可用空間的定期檢查

  

  

  

  怎樣定義表的大小

  

  SQL函數VSIZE返回以字節為單位的列值的大小VSIZE對於定義表的大小是相當有用的

  

  VSIZE可用來確定以下內容

  

  表中所有行的大小

  以字節為單位的平均行大小

  以字節為單位的最大的行尺寸

  

  下面介紹完成該項任務的技術 計算總的大小

  

  使用VSIZE與其它的SQL函數可計算表中所有行的總大小計算表大小的選擇語句的一般形式是

  

  SELECT SUM(NVL(VSIZE(col)))+ SUM(NVL(VSIZE(col)))+ … + SUM(NVL(VSIZE(coln))) FROM table;

  

  NVL函數用於將NULL值替換為

  

  計算平均行尺寸

  

  將SUM改為AVG可以計算平均行尺寸

  

  計算最大行尺寸

  

  將SUM改為MAX可以獲得表的最大行的尺寸

  

  

  

  怎樣確定PCTFREE的最佳值

  

  PCTFREE指定Oracle為容納當前存儲行在更新時的擴展而在數據塊中保留的可用空間數量如果PCTFREE設得值很低就有出現行遷移的危險如果設得過高可能會浪費空間並由於每空中的行很少而導致較低的塊密度

  

  用經驗方法估計PCTFREE

  

  可考慮對以下情況的表設置較高的PCTFREE值(a)包含有今後要被更新的空列的記錄(b)包含有小尺寸的但今後可能被更新為較大值的列

  

  利用公式計算PCTFREE


From:http://tw.wingwit.com/Article/program/Oracle/201311/17734.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.