Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

91

积分

0

好友

3

主题
1#
发表于 2012-1-4 16:42:30 | 查看: 11007| 回复: 14
请问如何确定表的高水位线,表是没有分析过的
2#
发表于 2012-1-4 17:11:38
参考

http://www.oracledatabase12g.com ... igh-water-mark.html
&
http://www.oracledatabase12g.com ... -mark-truncate.html
  1. SELECT TABLE_NAME ,  (BLOCKS *8192 / 1024/1024 ) - (NUM_ROWS*AVG_ROW_LEN/1024/1024)
  2. "Data lower than HWM in MB"   FROM  DBA_TABLES WHERE  UPPER(owner) =UPPER('&OWNER') order by 2 desc;
复制代码
or
  1. set serveroutput on
  2. DECLARE
  3. TOTAL_BLOCKS number;
  4. TOTAL_BYTES number;
  5. UNUSED_BLOCKS number;
  6. UNUSED_BYTES number;
  7. LAST_USED_EXTENT_FILE_ID number;
  8. LAST_USED_EXTENT_BLOCK_ID number;
  9. LAST_USED_BLOCK number;
  10. BEGIN
  11. dbms_space.unused_space('SYS',
  12. 'MACLEAN_TEST1',
  13. 'TABLE',
  14. TOTAL_BLOCKS,
  15. TOTAL_BYTES,
  16. UNUSED_BLOCKS,
  17. UNUSED_BYTES,
  18. LAST_USED_EXTENT_FILE_ID,
  19. LAST_USED_EXTENT_BLOCK_ID,
  20. LAST_USED_BLOCK);

  21. dbms_output.put_line('OBJECT_NAME = MACLEAN_TEST1');
  22. dbms_output.put_line('-----------------------------------');
  23. dbms_output.put_line('TOTAL BLOCKS = ' || TOTAL_BLOCKS);
  24. dbms_output.put_line('TOTAL SIZE(KByte) = ' ||
  25. TOTAL_BYTES / 1024);
  26. dbms_output.put_line('UNUSED BLOCKS = ' || UNUSED_BLOCKS);
  27. dbms_output.put_line('UNUSED SIZE(KByte) = ' ||
  28. UNUSED_BYTES / 1024);
  29. END;
  30. /
复制代码
自行替换代码中的schema与表名

回复 只看该作者 道具 举报

3#
发表于 2012-1-4 17:57:37
多谢

但是你的方法都是表是需要分析的,我想问有没有方法在表不被分析的情况下计算HWM?

回复 只看该作者 道具 举报

4#
发表于 2012-1-4 18:00:40
不分析要抓这些数据似乎有难度吧?!

回复 只看该作者 道具 举报

5#
发表于 2012-1-4 18:56:40
分析(analyze or dbms_stats)  不可用
dbms_space也不可用 的情况下可以 通过rowid来大致定位
  1. select count(distinct dbms_rowid.rowid_block_number(rowid) ||
  2.              dbms_rowid.rowid_relative_fno(rowid)) "reality block used"
  3.   from table;
复制代码
但是这种方法并不准确, 为什么 不能用dbms_stats or dbms_space分析?

回复 只看该作者 道具 举报

6#
发表于 2012-1-9 16:46:24
如果不进行表分析 要得到准确的数据 还是比较难的

回复 只看该作者 道具 举报

7#
发表于 2012-1-10 15:18:08
也是可以换个思路,通过查看  数据填充情况
SELECT f
      ,b
      ,COUNT(*)
  FROM (SELECT dbms_rowid.rowid_relative_fno(ROWID) f
              ,dbms_rowid.rowid_block_number(ROWID) b
          FROM zyf_1)
GROUP BY f
         ,b;

回复 只看该作者 道具 举报

8#
发表于 2012-1-10 15:22:47
用rowid 是可以估算,我在5楼提到的方法也是类似的。

但是如果表上有过大规模的删除操作的话, 由rowid获得的填充情况 可能无法准确体现高水位,所以只能作为一种参考。

回复 只看该作者 道具 举报

9#
发表于 2012-1-10 16:23:35
原帖由 maclean 于 2012-1-4 18:56 发表 分析(analyze or dbms_stats)  不可用 dbms_space也不可用 的情况下可以 通过rowid来大致定位select count(distinct dbms_rowid.rowid_block_number(rowid) ||             dbms_rowid.rowid_relative_fno(rowid)) ...

这种方法不行的,只要有delete,就很不准确了。

如果真的不能做表分析,那么你就dump segment header去看吧。

创建一个表,高水位下187个block
  1. SQL> create table t as select * from dba_objects;

  2. Table created.

  3. SQL> exec dbms_stats.gather_table_stats('KAMUS','T');

  4. PL/SQL procedure successfully completed.

  5. SQL> select table_name,num_rows,blocks from tabs where table_name='T';

  6. TABLE_NAME                       NUM_ROWS     BLOCKS
  7. ------------------------------ ---------- ----------
  8. T                                   13333        187
复制代码



删掉大部分记录,只留1条,高水位不变。
  1. SQL> delete from t where rownum<13333;

  2. 13332 rows deleted.

  3. SQL> exec dbms_stats.gather_table_stats('KAMUS','T');

  4. PL/SQL procedure successfully completed.

  5. SQL> select table_name,num_rows,blocks from tabs where table_name='T';

  6. TABLE_NAME                       NUM_ROWS     BLOCKS
  7. ------------------------------ ---------- ----------
  8. T                                       1        187
复制代码



如果用上面这个SQL,只能得出1个block,因为确实只有一个rowid了
  1. SQL> select count(distinct dbms_rowid.rowid_block_number(rowid) || dbms_rowid.rowid_relative_fno(rowid)) "reality block used" from t;

  2. reality block used
  3. ------------------
  4.                  1
复制代码



找出segment header block,做dump
  1. SQL> select header_file,header_block,blocks,extents from dba_segments where segment_name='T' and owner='KAMUS';

  2. HEADER_FILE HEADER_BLOCK     BLOCKS    EXTENTS
  3. ----------- ------------ ---------- ----------
  4.           4         5610        256         17
  5. SQL> alter system dump datafile 4 block 5610;

  6. System altered.

  7. SQL> SELECT p.TRACEFILE
  8. FROM v$session s, v$process p, v$mystat m
  9. WHERE s.paddr = p.addr
  10. AND s.SID = m.SID
  11. AND m.statistic# = 0;  2    3    4    5  

  12. TRACEFILE
  13. ------------------------------------------------------------------------------------------------------------------------
  14. /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_26987.trc
复制代码



然后看trc文件,其中会有类似如下显示
  1.   --------------------------------------------------------
  2.   Low HighWater Mark :
  3.       Highwater::  0x0100173b  ext#: 16     blk#: 59     ext size: 128
  4.   #blocks in seg. hdr's freelists: 0
  5.   #blocks below: 187
  6.   mapblk  0x00000000  offset: 16
  7.   Level 1 BMB for High HWM block: 0x01001700
  8.   Level 1 BMB for Low HWM block: 0x01001700
  9.   --------------------------------------------------------
复制代码



注意其中的#blocks below: 187,这就跟表分析得出的结果是一样的。

回复 只看该作者 道具 举报

10#
发表于 2012-1-10 16:28:34
是的, 我也是这个意思, 不过Kamus 实际演示了一遍 让这个帖子更完善了。

回复 只看该作者 道具 举报

11#
发表于 2012-1-10 22:40:37
最近正在研究rowid,学习了..

回复 只看该作者 道具 举报

12#
发表于 2012-1-11 08:33:19
这个帖子可以加精华了。

回复 只看该作者 道具 举报

13#
发表于 2012-1-11 14:47:40
请问下,kamus
Highwater::  0x0100173b  ext#: 16     blk#: 59     是说明hwm指向16区,59block吗?

回复 只看该作者 道具 举报

14#
发表于 2012-1-12 00:22:19
原帖由 wzhihua 于 2012-1-11 14:47 发表 请问下,kamusHighwater::  0x0100173b  ext#: 16     blk#: 59     是说明hwm指向16区,59block吗?

嗯,是的,第16个extent中的第59个block,59不是block id另外,我贴出来的是low high watermark,其上还有high high watermark

回复 只看该作者 道具 举报

15#
发表于 2013-5-18 16:53:10
看这里。http://blog.csdn.net/wuxbeyond/article/details/8943942

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-28 11:44 , Processed in 0.051598 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569