oracle优化--表优化(pctfree参数)

来源:这里教程网 时间:2026-03-03 11:51:34 作者:

试验结论:

1、当一张表自建立后只有新增基本不更新时(如存放历史记录的表),可以将pctfree参数尽量调低,这样表数据存储空间以及全表扫描时消耗都会更低;

2、但当表存在大量的update操作时,pctfree调低将会导致修改操作以及修改后表查询性能的性能下降,主要原因为产生了行迁移或行迁移

试验步骤: 一、创建试验表,分别设置pctfree为30与5 create table t_pctfree_30     (     name varchar2(20),     created date     )     tablespace users     pctfree 30; create table t_pctfree_5     (     name varchar2(20),     created date     )     tablespace users     pctfree 5; 二、插入随机字符串 begin     for i in 1 .. 10000 loop     insert into t_pctfree_30 values(dbms_random.string('u', 10),sysdate+s_test_id.Nextval/24/60/60);     end loop;     end; / begin     for i in 1 .. 10000 loop     insert into t_pctfree_5 values(dbms_random.string('u', 10),sysdate+s_test_id.Nextval/24/60/60);     end loop;     end; / 三、查看两张实验表占用空间情况 SQL> select s.segment_name,s.BYTES,s.blocks from user_segments s where s.segment_name in ('T_PCTFREE_5','T_PCTFREE_30'); SEGMENT_NAME --------------------------------------------------------------------------------      BYTES     BLOCKS ---------- ---------- T_PCTFREE_5     327680    40 T_PCTFREE_30     393216    48 四、开启执行计划,查看查询性能消耗,可以发现PCTFREE为30的表比5的实验表全表扫描时,cpu消耗增加20%左右 SQL> select count(0) from T_PCTFREE_30; Execution Plan ---------------------------------------------------------- Plan hash value: 3114683171 --------------------------------------------------------------------------- | Id  | Operation    | Name   | Rows  | Cost (%CPU)| Time   | --------------------------------------------------------------------------- |   0 | SELECT STATEMENT   |   | 1 |    13   (0)| 00:00:01 | |   1 |  SORT AGGREGATE    |   | 1 |        |   | |   2 |   TABLE ACCESS FULL| T_PCTFREE_30 | 10000 |    13   (0)| 00:00:01 | --------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ----------------------------------------------------------   5  recursive calls   0  db block gets 93  consistent gets   0  physical reads   0  redo size 526  bytes sent via SQL*Net to client 524  bytes received via SQL*Net from client   2  SQL*Net roundtrips to/from client   0  sorts (memory)   0  sorts (disk)   1  rows processed SQL> select count(0) from T_PCTFREE_5; Execution Plan ---------------------------------------------------------- Plan hash value: 2627062867 -------------------------------------------------------------------------- | Id  | Operation    | Name | Rows  | Cost (%CPU)| Time | -------------------------------------------------------------------------- |   0 | SELECT STATEMENT   | |     1 |    11   (0)| 00:00:01 | |   1 |  SORT AGGREGATE    | |     1 |       | | |   2 |   TABLE ACCESS FULL| T_PCTFREE_5 | 10000 |    11   (0)| 00:00:01 | -------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ----------------------------------------------------------   5  recursive calls   0  db block gets 77  consistent gets   0  physical reads   0  redo size 526  bytes sent via SQL*Net to client 524  bytes received via SQL*Net from client   2  SQL*Net roundtrips to/from client   0  sorts (memory)   0  sorts (disk)   1  rows processed 五、对两站表进行update,查看修改时以及修改后性能对比,发现PCTFREE为5的实验表相对30的表性能消耗增大了 SQL> update T_PCTFREE_30 set name=dbms_random.string('u', 15); 10000 rows updated. Execution Plan ---------------------------------------------------------- Plan hash value: 3098004561 ----------------------------------------------------------------------------------- | Id  | Operation    | Name   | Rows  | Bytes | Cost (%CPU)| Time  | ----------------------------------------------------------------------------------- |   0 | UPDATE STATEMENT   |   | 10000 |   117K|    13   (0)| 00:00:01 | |   1 |  UPDATE    | T_PCTFREE_30 |   |   |        |  | |   2 |   TABLE ACCESS FULL| T_PCTFREE_30 | 10000 |   117K|    13   (0)| 00:00:01 | ----------------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 105  recursive calls       20486  db block gets 156  consistent gets   1  physical reads     4855444  redo size 843  bytes sent via SQL*Net to client 813  bytes received via SQL*Net from client   3  SQL*Net roundtrips to/from client   5  sorts (memory)   0  sorts (disk)       10000  rows processed SQL> update T_PCTFREE_5 set name=dbms_random.string('u', 15); 10000 rows updated. Execution Plan ---------------------------------------------------------- Plan hash value: 2342466916 ---------------------------------------------------------------------------------- | Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------- |   0 | UPDATE STATEMENT   | | 10000 |   117K|    15   (0)| 00:00:01 | |   1 |  UPDATE    | T_PCTFREE_5 | | |       | | |   2 |   TABLE ACCESS FULL| T_PCTFREE_5 | 10000 |   117K|    15   (0)| 00:00:01 | ---------------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 326  recursive calls       30936  db block gets        4738  consistent gets   4  physical reads     5447700  redo size 843  bytes sent via SQL*Net to client 812  bytes received via SQL*Net from client   3  SQL*Net roundtrips to/from client 42  sorts (memory)   0  sorts (disk)       10000  rows processed SQL> select count(0) from T_PCTFREE_5; Execution Plan ---------------------------------------------------------- Plan hash value: 2627062867 -------------------------------------------------------------------------- | Id  | Operation    | Name | Rows  | Cost (%CPU)| Time | -------------------------------------------------------------------------- |   0 | SELECT STATEMENT   | |     1 |    15   (0)| 00:00:01 | |   1 |  SORT AGGREGATE    | |     1 |       | | |   2 |   TABLE ACCESS FULL| T_PCTFREE_5 | 10000 |    15   (0)| 00:00:01 | -------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ----------------------------------------------------------   0  recursive calls   0  db block gets 53  consistent gets   0  physical reads   0  redo size 526  bytes sent via SQL*Net to client 524  bytes received via SQL*Net from client   2  SQL*Net roundtrips to/from client   0  sorts (memory)   0  sorts (disk)   1  rows processed SQL> select count(0) from T_PCTFREE_30; Execution Plan ---------------------------------------------------------- Plan hash value: 3114683171 --------------------------------------------------------------------------- | Id  | Operation    | Name   | Rows  | Cost (%CPU)| Time   | --------------------------------------------------------------------------- |   0 | SELECT STATEMENT   |   | 1 |    13   (0)| 00:00:01 | |   1 |  SORT AGGREGATE    |   | 1 |        |   | |   2 |   TABLE ACCESS FULL| T_PCTFREE_30 | 10000 |    13   (0)| 00:00:01 | --------------------------------------------------------------------------- Note -----    - dynamic sampling used for this statement (level=2) Statistics ----------------------------------------------------------   0  recursive calls   0  db block gets 46  consistent gets   0  physical reads   0  redo size 526  bytes sent via SQL*Net to client 524  bytes received via SQL*Net from client   2  SQL*Net roundtrips to/from client   0  sorts (memory)   0  sorts (disk)   1  rows processed 六、查看数据行存储情况 1、对表进行分析统计 analyze  table  T_PCTFREE_5  compute statistics; analyze  table  T_PCTFREE_30  compute statistics; 2、查看数据行情况 SQL> select table_name,avg_row_len,num_rows,chain_cnt,chain_cnt/num_rows,pct_free  from user_tables where table_name in ('T_PCTFREE_5','T_PCTFREE_30'); TABLE_NAME        AVG_ROW_LEN   NUM_ROWS  CHAIN_CNT    CHAIN_CNT/NUM_ROWS   PCT_FREE ------------------------------ ----------- ---------- ---------------------------- ---------- T_PCTFREE_30 27 10000        0 0    30 T_PCTFREE_5 28 10000     2052      .2052     5

相关推荐