表上高水位线:通常一个新建的表,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. Python获取token数据的几种方式

    import requestsfrom urllib import requestimport re# 一.从响应头中获取token# 登录url = 'http://xxx.nhf.cn/api/b ...

  2. 喜报 | ShowMeBug获国家高新技术企业认证!

    近日,深圳至简天成科技有限公司(以下简称至简天成)顺利通过国家高新技术企业认证! 国家高新技术企业是由国务院主导.科技部牵头的国家级荣誉资质,是我国科技类企业中的"国"字号招牌,完 ...

  3. 文字生成图像 AI免费工具第一弹 StableDiffusion

    随着ChatGPT的爆火,text-to-image文字生成图像.以及更广义的AIGC(AI Generated Content)相关的话题最近一直热度不减.相信大家这几天经常会在各类的自媒体.甚至是 ...

  4. 一分钟学一个 Linux 命令 - find 和 grep

    前言 大家好,我是 god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天需要你花两分钟时间来学习下,因为今天要介绍的是 ...

  5. CKS 考试题整理 (02)-Apparmor

    Context Apparmor 已在 cluster 的工作节点 node02 上被启用.一个 Apparmor 配置文件已存在,但尚未被实施. Task 在 cluster 的工作节点 node0 ...

  6. 浅析开源容器标准——OCI

    1.导语 容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准.此后,为了推进容器生态的健康发展.在Linux基金会的主导下,Docker和各大云厂商Google, Amazon ...

  7. Java使用redis-Redis是并发安全的吗?

    大家都清楚,Redis 是一个开源的高性能键值对存储系统,被开发者广泛应用于缓存.消息队列.排行榜.计数器等场景.由于其高效的读写性能和丰富的数据类型,Redis 受到了越来越多开发者的青睐.然而,在 ...

  8. 图书商城Vue+Element+Node项目练习(...)

    本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程.面向初学者,本人也是初学者,搬砖技术还不成熟.项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite).到 ...

  9. kibana基本操作

    kibana基本应用 一.简介 ​ Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的.你可以用kibana搜索.查看存放在Elasticsearch中的数据 ...

  10. 如何制作 GitHub 个人主页

    人们在网上首先发现你的地方是哪里?也许你的社交媒体是人们搜索你时首先发现的东西,亦也许是你为自己创建的投资组合网站.然而,如果你使用GitHub来分享你的代码并参与开源项目,那么你的GitHub个人主 ...