表上高水位线:通常一个新建的表,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

Oracle-判断表上存在高水位线的更多相关文章

  1. oracle优化:避免全表扫描(高水位线)

    如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...

  2. oracle 基础知识(十五)----高水位线

    一,oracle的逻辑存储管理 ORACLE的逻辑存储管理,分4个粒度:表空间,段,区和块. ## 块 粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是 ...

  3. SqlServer和Oracle判断表和列是否存在

    SqlServer .判断表Users是否存在 if object_id(N'Users',N'U') is not null print '存在' else print '不存在' .判断表User ...

  4. Oracle案例10——HWM(高水位线)性能优化

    最近BI同事反馈说一张表的数据查询非常慢,这个表数据总共不到1W行数据,这么一说我们首先想到的是高水位带来的性能问题,即高水位线下占用过多数据块,而这些数据块其实是部分数据占用,大多数是空闲的数据块. ...

  5. Oracle判断表、列、主键是否存在的方法

    在编写程序时,数据库结构会经常变化,所以经常需要编写一些数据库脚本,编写完成后需发往现场执行,如果已经存在或者重复执行,有些脚本会报错,所以需要判断其是否存在,现在我就把经常用到的一些判断方法和大家分 ...

  6. Oracle在表上建立自增字段的方法

    本方法为使用SEQUENCE(序列)   例如有表temp_test结构为: create table TEMP_TEST ( id number, nm varchar(10), primary k ...

  7. oracle编译表上失效USERDBY脚本

    对表进行DLL操作之后,依赖这个表的一些存储过程,触发器等会失效,可以用下边的脚本进行重编译 /* Formatted on 2020/7/8 上午 09:31:31 (QP5 v5.163.1008 ...

  8. Oracle的高水位线

    一.什么是水位线 所有的oracle段都会有一个在段内容纳数据的上线,把这个上限成为“high water mark”,这是一个标记,用来说明已经有多少没有使用的数据块分配给这个段,原则上high w ...

  9. Oracle 高水位线和全表扫描

    --Oracle 高水位线和全表扫描--------------------------2013/11/22 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至 ...

  10. 08 Oracle表碎片查询以及整理(高水位线)

    Oracle表碎片查询以及整理(高水位线) 1.表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用. 2.怎样确定是否有表碎片 ...

随机推荐

  1. WPF中实现含有中心点Slider双向滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...

  2. WFP必须掌握的技能之自定义控件——实战:自制上传文件显示进度按钮

    自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造. 目录 按钮设置圆角 按钮上传文件相关定义 测试代码 话不多说直接看效果 默认效果: 上 ...

  3. celery笔记八之数据库操作定时任务

    本文首发于公众号:Hunter后端 原文链接:celery笔记八之数据库操作定时任务 前面我们介绍定时任务是在 celery.py 中的 app.conf.beat_schedule 定义,这一篇笔记 ...

  4. Taurus .Net Core 微服务开源框架:Admin 插件【4-2】 - 配置管理-Mvc【含请求日志打印】

    前言: 继上篇:Taurus .Net Core 微服务开源框架:Admin 插件[4-1] - 配置管理-Kestrel[含https启用] 本篇继续介绍下一个内容: 1.系统配置节点:Mvc 配置 ...

  5. 2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负。 爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,

    2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = ...

  6. HTML的总结与回顾(思维导图

  7. 2021-7-6 new tcpip

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...

  8. React:如何在普通函数中使用Hook

    解决方案

  9. 基于 Habana Gaudi 的 Transformers 入门

    几周前,我们很高兴地 宣布 Habana Labs 和 Hugging Face 将开展加速 transformer 模型的训练方面的合作. 与最新的基于 GPU 的 Amazon Web Servi ...

  10. Cilium系列-11-启用带宽管理器

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...