Oracle 增加分区表上的PCTFREE

Oracle 增加分区表上的PCTFREE,oracle,ddl,Oracle,Ddl,我们必须增加表的PCTFREE属性,以检查它是否允许在同一个表上运行2个事务,并在不提交更改的情况下更改表数据。我听说增加PCTFREE有助于消除死锁 alter table tablename modify default attributes PCTFREE 50; 结果显示该表已被更改,但当我检查dba_表时,它将PCTFREE的值显示为null。有没有办法将它增加到一个更高的值 这是一个我们不能增加分区的默认属性的错误吗?表。首先,您需要了解什么是PCTFREE。在一个非常简单的定义中

我们必须增加表的PCTFREE属性,以检查它是否允许在同一个表上运行2个事务,并在不提交更改的情况下更改表数据。我听说增加PCTFREE有助于消除死锁

alter table tablename modify default attributes PCTFREE 50;
结果显示该表已被更改,但当我检查dba_表时,它将PCTFREE的值显示为null。有没有办法将它增加到一个更高的值


这是一个我们不能增加分区的默认属性的错误吗?表。

首先,您需要了解什么是
PCTFREE
。在一个非常简单的定义中,您可以定义
PCTFREE
参数,用于将块的百分比设置为
保留
,以便对该块中已包含的行进行可能的
更新。例如,假设在
CREATE TABLE
语句中指定以下参数:

PCTFREE 20

这表示用于此表数据段的每个数据块的
20%
将保持空闲,并可用于对每个块中已有行的可能更新。 较大的PCTFREE具有以下效果:

•为将来更新现有表行保留更多空间

•对于相同数量的插入数据,可能需要更多的块(插入 每个块的行数较少)

这就是为什么你会发现绩效提高的原因

其次,要增加PCTFREE,如果您决定不使用默认值,则必须记住以下几点

•PCTFREE和PCTUSED之和必须等于或小于100

•如果总和等于100,则Oracle将尝试保留不超过 PCTFREE自由空间,处理成本最高

•100与PCTFREE和 PCTUSED(如PCTUSED为75,PCTFREE为20)是更有效的空间 以一定的性能代价,使用率是有限的

因此,仅仅改变PCTFREE 50不会带来更多的优势。根据您试图在数据库上执行的活动,必须设置这些值。请阅读此处,了解不同场景中必须使用的所有值

最好的方法是删除并创建具有修改值的表,如下所示:

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);

对于分区表,
dba\u tables.pct\u free
始终为空。默认的pctfree显示在
dba\u part\u表中。def\u pct\u free

检查链接。因此,如果两个事务试图更新同一块上的不同行,那么在第一个事务更改块上的位和字节时,其中一个事务将不得不在缓冲区繁忙等待的情况下短暂等待。它不必等待提交—只需等待第一个事务进行更改并将修改后的块放回缓存—然后就可以进行修改。也许值得一提的是,对于段空间管理=自动的本地管理表空间,PCTUSED被忽略,这是默认值(自10g R2起).您如何知道PCTFREE与死锁问题有关?您是否查看了死锁跟踪文件以找到两个相关的SQL语句和对象ID?根据我的经验,死锁总是由两个SQL语句以不同的顺序竞争相同的锁、未索引的外键或对具有位图索引的对象运行多个DML引起的。人们通常希望有一些神奇的表设置来消除死锁,但不幸的是,99%以上的死锁都是应用程序错误。那么有没有办法更改分区表的PCTFREE值呢?如果是,请告诉我怎么做?