2017-06-30 25 views
0

我們必須增加表的PCTFREE屬性,以檢查它是否允許2個事務可以在同一個表上運行,並在不提交更改的情況下更改表數據。我讀它是asktom,增加PCTFREE可以去除死鎖在分配表上增加PCTFREE

alter table tablename modify default attributes PCTFREE 50; 

結果顯示,該表已被改變,但是當我檢查了DBA_TABLES,它是爲PCTFREE爲空值顯示幫助。有沒有辦法將它增加到更高的價值。

這是一個錯誤,我們不能增加分區的默認屬性?表。有人可以幫忙嗎?

+0

你怎麼知道PCTFREE與死鎖問題有關?您是否查看死鎖跟蹤文件以查找兩個相關的SQL語句和對象ID?在我的經驗中,死鎖總是由兩個SQL語句引起的,這兩個SQL語句以不同的順序競爭相同的鎖,未索引的外鍵,或者針對具有位圖索引的對象運行多個DML。人們經常希望有一些神奇的表設置來使死鎖消失,但不幸的是,99%以上的所有死鎖都是應用程序錯誤。 –

回答

0

首先您需要了解什麼是PCTFREE。在一個非常簡單的定義中,您可以定義PCTFREE參數用於將塊的百分比設置爲reserved對於可能的updates已包含在該塊中的行。例如,假設你CREATE TABLE語句中指定下列參數:

PCTFREE 20

這表明用於此表的數據段的每個數據塊的20%將保持免費的,可以用於每個塊內已有行的可能更新。 較大PCTFREE具有以下效果:

•儲量更多的空間以備將來更新現有表中的行

•可能需要對於相同量的插入的數據的多個塊(插入 針對每個塊更少的行)

這就是爲什麼你發現改進的原因。

其次,增加你的PCTFREE你必須保持低於點記住,如果你決定不使用默認的

•PCTFREE和PCTUSED之和必須等於或小於100

•如果總和等於100,則Oracle嘗試保留不多於自由空間,並且處理成本最高。

•100與PCTFREE和PCTUSED之和之差(如PCTUSED 75,PCTFREE 20)之間的差異越小,則在某些性能成本下使用效率更高的空間。

因此,簡單地更改PCTFREE 50將不會帶來更多優勢。根據您嘗試在數據庫上執行的活動,您必須設置這些值。在這裏閱讀不同的場景,你必須使用什麼樣的價值。 Here

最好的辦法是與體改值下降並創建表:

CREATE TABLE players 
     (code NUMBER(10) PRIMARY KEY, 
     lastname VARCHAR(20), 
     firstname VARCHAR(15), 
     position VARCHAR2(20), 
     team VARCHAR2(20)) 
     PCTFREE 10 
     PCTUSED 40 
     STORAGE 
     (INITIAL 25K 
      NEXT 10K 
      MAXEXTENTS 10 
      MINEXTENTS 3); 
+0

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2556828000346627752 – Maharajaparaman

+0

檢查鏈接..。因此,如果兩個事務嘗試更新同一個塊上的不同行 - 必須等待一個緩衝區忙等待,而第一個事務更改該塊上的位和字節。它不需要等待提交 - 只需要等待第一個事務進行更改並將修改後的塊放回緩存中 - 然後就可以進行修改。 – Maharajaparaman

+0

@ Maharajaparaman.So你想在這裏做什麼? – XING

0

對於分區表,dba_tables.pct_free始終爲空。默認pctfree顯示在dba_part_tables.def_pct_free中。

+0

那麼有沒有辦法改變分區表的PCTFREE值?如果是,請告訴我如何? – Maharajaparaman

+0

你這樣做的方式有什麼問題? –