【實驗室-技術報道】兩者之間的區別
行連接是指一個行存儲在多個塊中的情況
行遷移是指一個數據行不適合放入當前塊而被重新定位到另一個塊
行連接通常與行的長度和oracle數據庫塊中的大小有關
檢查是否存在行遷移或是連接
(
(
OWNER_NAME TABLE_NAME CLUST
SCOTT ORDER_HIST
SCOTT ORDER_HIST
SCOTT ORDER_HIST
貼個document
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
by the LIST CHAINED ROWS clause
For example
Creating a CHAINED_ROWS Table
To create the table to accept data returned by an ANALYZE
UTLCHN
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
After a CHAINED_ROWS table is created
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:
Oracle
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 =
OWNER_NAME TABLE_NAME CLUST
SCOTT ORDER_HIST
SCOTT ORDER_HIST
SCOTT ORDER_HIST
The output lists all rows that are either migrated or chained
If the output table shows that you have many migrated or chained rows
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 =
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 =
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
DELETE FROM CHAINED_ROWS
WHERE TABLE_NAME =
Use the ANALYZE statement again
Any rows that appear in the output table are chained
It might not be possible to avoid chaining in all situations
column or long CHAR or VARCHAR
數據庫管理員面對的一個最常見的問題就是處理數據庫對象的碎片
數據庫碎片通常是行被插入
表空間變成碎片是由於錯誤以及表空間中的數據庫對象的無計劃撤銷和重建造成的
表空間碎片會導致下面的問題
◆表空間中的空間被分離且不能有效地使用
◆在需要重建分裂成碎片的對象會導致管理問題
數據字典是放在SYSTEM表空間中的
ALTER USER username DEFAULT USERS TEMPORARY TEMP;
處理表空間碎片的最好方法是避免它
要避免碎片
把對象用相似的空間和增長特性聚合在一起
如果可能
使每個段的PCTINCREASE保持為
可用空間的聚集是通過將多個鄰接的可用區變為一個較大的可用區
以下技術可用來聚集可用空間
可以使用ALTER TABLESPACE COALESCE命令
如果一個表空間的PCTINCREASE數據存儲參數的值大於零
首先
其次
再次
如果想要一個自動的過程
段及其區的信息可以從數據字典視圖DBA_SEGMENTS和DBA_EXTENTS中找到
可以使用導出和導入實用程序
在Oracle
對象碎片會導致下面的問題
對數據庫額外的讀調用會導致響應時間增加
由於在表和索引塊中的自由空間空洞導致空間的浪費
讀性能下降
行轉移在對行的修改引起行的長度比塊中可利用空間大時發生
Oracle每次必須執行至少一次額外的輸入/輸出讀來獲取轉移的行
Oracle也必須和行數據一起存儲額外的指針來共給行轉移機制
行連接在一個行太長以至於不能放入任何一個數據塊時發生
通常
行連接和行遷移都是不希望的情形
通過執行下面的步驟消除所有轉移行
(
CREATE TABLE temp_emp as
SELECT * FROM emp WHERE rowed in
(SELECT rowed FROM chained_rows WHERE table_name=
(
DELETE FROM emp WHERE rowed_in
(SELECT head_rowed FROM chained_rows
WHERE table_name=
(
INSERT INTO emp SELECT * FROM temp_emp;
這種方法的缺點
表中的許多自由空間可能永遠都沒用過
當這個表通過全表掃描被讀取時
在盡力避免行轉移時
行連接是非常難調整的
行連接和行遷移的技巧包括如下方面
行連接一旦出現
處理行連接的最好的方法就是防止它的出現
已開始就用大數據塊尺寸創建數據庫將有助於防止行連接
與行連接不同
經歷過繁重更新活動的數據段最容易產生行遷移
為STORAGE子句的參數PCTFREE指定的值對行遷移有很大的影響
使用ANALYZE命令方法或通過查詢V$SYSSTAT視圖
段能夠得到的區的最大數由MAXEXTENTS數據存儲參數決定
將對象的MAXEXTENTS設置為UNLIMITED
如果MAXEXTENTS不設為UNLIMITED
當由於表空間的可用空間匮乏而Oracle不能將一個區分配給對象時
SQL函數VSIZE返回以字節為單位的列值的大小
VSIZE可用來確定以下內容
表中所有行的大小
以字節為單位的平均行大小
以字節為單位的最大的行尺寸
下面介紹完成該項任務的技術
使用VSIZE與其它的SQL函數可計算表中所有行的總大小
SELECT SUM(NVL(VSIZE(col
NVL函數用於將NULL值替換為
將SUM改為AVG可以計算平均行尺寸
將SUM改為MAX可以獲得表的最大行的尺寸
PCTFREE指定Oracle為容納當前存儲行在更新時的擴展而在數據塊中保留的可用空間數量
可考慮對以下情況的表設置較高的PCTFREE值
From:http://tw.wingwit.com/Article/program/Oracle/201311/17734.html