Oracle-判斷表上存在高水位線


表上高水位線:通常一個新建的表,1個8K的數據塊存放100行記錄,若表上經常插入刪除操作,造成表的水位線很高。下面從發現高水位線的辦法,及解決高水位的方法說起:

1、發現存在高水位線的表:查看字典表user_tables,該表分配的數據塊blocks很多,然而記錄數num_rows確很少。

2、解決高水位的方法。

-----------------------------------------------------------------------實驗----------------------------------------------------------------------------------

一、發現存在高水位線的表-經常有插入刪除操作的表,水位線高,實驗證明:

1、查詢表上的數據塊大小
SQL> set linesize 1000;
SQL> col segment_name for a20
SQL> select SEGMENT_NAME,BYTES/BLOCKS/1024 K from user_extents where SEGMENT_NAME='TEST_EMP' fetch first 1 rows only;

SEGMENT_NAME                  K
-------------------- ----------
TEST_EMP                      8
表上的數據塊是8KB
2、新建表,查看一個數據塊存放多少行數據
SQL> CREATE TABLE TEST_EMP
  2         (TEST_EMPNO NUMBER(4) not null,
  3  ENAME VARCHAR2(10),
  4  JOB VARCHAR2(9),
  5  MGR NUMBER(4),
  6  HIREDATE DATE,
  7  SAL NUMBER(7,2),
  8  COMM NUMBER(7,2),
  9  DEPTNO NUMBER(2) );

表已創建。

SQL> exec dbms_stats.gather_table_stats(ownname=>'META',tabname=>'TEST_EMP',estimate_percent=>10,method_opt=>'for all indexed columns',cascade=>TRUE);

PL/SQL 過程已成功完成。
--收集表上的統計信息

SQL> select num_rows,blocks from user_tables where table_name='TEST_EMP';

  NUM_ROWS     BLOCKS
---------- ----------
         0          0
--新建表blocks為0,num_rows為0;
3、插入數據,多次插入
SQL>INSERT INTO TEST_EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO TEST_EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO TEST_EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO TEST_EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO TEST_EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO TEST_EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO TEST_EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO TEST_EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO TEST_EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO TEST_EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO TEST_EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO TEST_EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO TEST_EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO TEST_EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
SQL> insert into test_emp
  2  select * from test_emp;

已創建 12 行。
4、再次統計信息,獲取數據塊及記錄條數
SQL> exec dbms_stats.gather_table_stats(ownname=>'META',tabname=>'TEST_EMP',estimate_percent=>10,method_opt=>'for all indexed columns',cascade=>TRUE);

PL/SQL 過程已成功完成。

SQL> select num_rows,blocks from user_tables where table_name='TEST_EMP';

  NUM_ROWS     BLOCKS
---------- ----------
    392500       2386
5、查看一個塊存放多少記錄
SQL> select f,b,count(*) from (select dbms_rowid.rowid_relative_fno(rowid) f,dbms_rowid.rowid_block_number(rowid) b from test_emp)
   group by f,b;
         F          B   COUNT(*)
---------- ---------- ----------
        14    2568672        170
        14    2568676        170
        14    2568677        169
已選擇 2323 行。
--一個塊存放169行左右的數據

至此,發現一個新建的表只有插入記錄時,一個8K的數據塊存放169行記錄。test_emp表占用2386個數據塊,記錄行數392500。

若此時執行刪除操作,再次收集表上的統計信息,就會看到記錄條數為0時,test_emp表占用的數據塊仍然是2386塊。此時就造成了test_emp表上的高水位線

6、再次刪除記錄,查看test_emp占用的數據塊
SQL> delete from test_emp purge; 已刪除 393216 行。 SQL> exec dbms_stats.gather_table_stats(ownname=>'META',tabname=>'TEST_EMP',estimate_percent=>10,method_opt=>'for all indexed columns',cascade=>TRUE); PL/SQL 過程已成功完成。 SQL> select num_rows,blocks from user_tables where table_name='TEST_EMP'; NUM_ROWS BLOCKS ---------- ---------- 0 2386

故,8KB的數據塊存放169行記錄。若在字典表中看到test_emp表的num_rows與blocks差別太懸殊,則認為是高水位線。這是定性的方法,至於定量的還在研究中。

二、解決高水位的方法:https://www.cnblogs.com/handhead/p/13158177.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM