iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >数据库中如何降低高水位
  • 736
分享到

数据库中如何降低高水位

2024-04-02 19:04:59 736人浏览 安东尼
摘要

这篇文章主要为大家展示了“数据库中如何降低高水位”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何降低高水位”这篇文章吧。 降低高水位方法1. mov

这篇文章主要为大家展示了“数据库中如何降低高水位”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何降低高水位”这篇文章吧。

降低高水位方法

1. move

a.move不但可以重置水位线(HWM),解决松散表带来的 io 浪费,还可以解决表中的行迁移问题;

b.move可以将表移动到其他表空间,也可以在原表空移动,这样可以一定程度解决表空间碎片;

c.如果表空间上有大量表、索引被 drop(或者 truncate),导致表空间前半部分出现大量空闲空间,可以通过 move 将靠后的表移动到前面的空闲空间,从而收缩数据文件。

 

实验:

sys@ORCL>conn shall/shall

Connected.

shall@ORCL>create table zhong(x int);

Table created.

 

shall@ORCL>begin

  2  for i in 1..100000 loop

  3  insert into zhong values(i);

  4  end loop;

  5  commit;

  6  end;

  7  /

 

PL/sql procedure successfully completed.

 

----收集统计信息

shall@ORCL>analyze table zhong compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 244           12

 

----deletezhong

shall@ORCL>delete zhong;

100000 rows deleted.

 

shall@ORCL>analyze table zhong compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 244           12

 

----move整理碎片

shall@ORCL>alter table zhong move;

Table altered.

或者 alter table zhong move tablespace hct;    ----move到hct表空间

 

shall@ORCL>analyze table zhong compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                   0            8

 

----高水位已经降下来了。move到该表空间,需要保证有足够的剩余空间

 

----重建索引

shall@ORCL> alter index inx_t_x rebuild;

Index altered.

或 alter index inx_t_x rebuild tablespace users;

 

----查看索引状态

SCOTT@test> set linesize 200

SCOTT@test> select index_name,table_name,tablespace_name,status from user_indexes;

 

 

----注意事项:

----Rebuild index

在对表进行 move 操作后,表中的 rowid 发生了改变,这样导致索引无法定位到原来表中的数据,从而触发了索引失效,所以需要 alter index index_name rebuild [online] 的命令进行重建。

----空间分配

alter table move操作,必须给move的表空间足够的剩余空间,否则可能会出现 ORA-01652 告警。

----exclusive lock

move 操作相当于将表中所有数据移动,因此在move的过程中,oracle会对表放置了 exclusive lock ,此时只能对它进行 select 操作。

 

2. shrink space

此命令为 Oracle 10g 新增功能,shrink 操作是将原本松散的数据存放结构,通过将表中靠后的行向前面的空闲块迁移,在完成后将完全空闲的区释放,并前置 HWM 到表中最后一个使用块的位置,从而实现松散表重新结构紧凑。

 

使用条件

                自动段管理模式。只支持 ASSM 管理的表空间,如果不是会报ORA-10635: Invalid segment or tablespace type

                打开行移动  alter table table_name enable row movement

 

参数:

alter table TABLE_NAME shrink space [compact|cascate]

 

alter table TABLE_NAME shrink space; 整理碎片并回收空间

alter table TABLE_NAME shrink space compact; 只整理碎片 不回收空间

alter table TABLE_NAME shrink space cascate; 整理碎片回收空间 并连同表的级联对象一起整理(比如索引)

 

使用步骤

1. alter table t1 enable ROW MOVEMENT;

2. shrink 操作

3. alter table t1 disable ROW MOVEMENT;

 

实验:

----查看表空间段管理模式

sys@ORCL>select tablespace_name,block_size,extent_management,allocation_type,segment_space_management from dba_tablespaces order by segment_space_management;

TABLESPACE_NAME                BLOCK_SIZE EXTENT_MAN ALLOCATIO SEGMEN

------------------------------ ---------- ---------- --------- ------

SYSAUX                               8192 LOCAL      SYSTEM    AUTO

HCT                                  8192 LOCAL      SYSTEM    AUTO

USERS                                8192 LOCAL      SYSTEM    AUTO

EXAMPLE                              8192 LOCAL      SYSTEM    AUTO

TEMP                                 8192 LOCAL      UNIFORM   MANUAL

UNDOTBS1                             8192 LOCAL      SYSTEM    MANUAL

SYSTEM                               8192 LOCAL      SYSTEM    MANUAL

 

----查看shall用户使用的默认表空间

sys@ORCL>select username,default_tablespace,temporary_tablespace from dba_users where username='SHALL';

USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE

------------------------------ ------------------------------ ------------------------------

SHALL                          USERS                          TEMP

 

----创建表及插入数据

sys@ORCL>conn shall/shall

Connected.

shall@ORCL>create table shall(ttt int);

Table created.

 

sys@ORCL>begin

  2  for i in 1..1000000 loop

  3    insert into shall values(i);

  4   end loop;

  5   commit;

  6  end;

  7  /

PL/SQL procedure successfully completed.

 

shall@ORCL>analyze table shall compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='SHALL';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

SHALL                                1630           34

 

----deleteshall

shall@ORCL>delete shall;

1000000 rows deleted.

 

shall@ORCL>analyze table shall compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='SHALL';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

SHALL                                1630           34

 

----开始shrink整理碎片

shall@ORCL>alter table shall enable row movement;

Table altered.

 

shall@ORCL>alter table shall shrink space;

Table altered.

 

shall@ORCL>alter table shall disable row movement;

Table altered.

 

----为刷新统计信息之前,高水位未降

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='SHALL';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

SHALL                                1630           34

 

shall@ORCL>analyze table shall compute statistics;

Table analyzed.

 

shall@ORCL>select table_name,blocks,empty_blocks from user_tables where table_name='SHALL';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

SHALL                                   1            7

 

使用shrink降低高水位的优点:

1)能在线进行,不影响表上的DML操作,当然,并发的DML操作在shrink结束的时刻会出现短暂的block;

2)shrink的另外一个优点是在碎片整理结束后,表上相关的index仍然enable。

                对于第二点进一步说明下,shrink在整理表碎片的时候,行的rowid已经发生改变,那为什么相关的索引还能enable呢?其实oracle在进行shrink的时候会对相应的索引进行维护,以保证index在shrink结束的时候index仍然有效。这个维护不同于索引rebuild,不会对索引的空间进行整理,shrink有cascede选项,如果在shrink的时候加上该选项,就会对表上相应的索引空间进行整理。 ALTER TABLE tablename SHRINK SPACE CASCADE;

       

shrink也可以分两步进行

1)先执行ALTER TABLE tablename SHRINK SPACE compact,此时oracle会在高水位线以下将row尽量向segment的顶部移动,但不收缩高水位线,即不释放空间。这个操作对于那些在尝试读取已经被释放的块的查询是有益的。

2)然后在执行ALTER TABLE test SHRINK SPACE,此时第一步中的结果已经存储到磁盘,不会重新在整理碎片,只是收缩高水位,释放空间。第二步操作应该在系统不繁忙时候进行。

 

shrink的工作原理

shrink的算法是从segment的底部开始,移动row到segment的顶部,移动的过程相当于delete/insert操作的组合,在这个过程中会产生大量的undo和redo信息。

 

另外, 对于空间的要求,shrink不需要额外的空间,move需要两倍的空间。

 

3. rename to

复制要保留的数据到临时表t,drop原表,然后rename to临时表t为原表

验证:

   begin

                for i in 1..100000 loop

                  insert into t2 values(i);

                end loop;

                commit;

   end;

   /

   analyze table t2 compute statistics;

   select table_name,blocks,empty_blocks

                from dba_tables

      where table_name='T2';

 

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

T2                                    152          103

 

SQL> delete t2;

100000 rows deleted.

SQL> create table t3 as select * from t2;

SQL> analyze table t2 compute statistics;

SQL> select table_name,blocks,empty_blocks

  2  from dba_tables

  3  where table_name='T2';

 

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

T2                                    152          103

 

SQL> drop table t2;

SQL> alter table t3 rename to t2;

SQL> analyze table t2 compute statistics;

SQL> select table_name,blocks,empty_blocks

  2  from dba_tables

  3  where table_name='T2';

 

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

T2                                      1            6

 

4. exp/imp

用EXP导出后,删除原表/表空间,之后用IMP重新导入

实验:

shall@ORCL>create table zhong(id int);

Table created.

 

shall@ORCL>begin

  2  for i in 1..1000000 loop

  3  insert into zhong values(i);

  4  end loop;

  5  commit;

  6  end;

  7  /

PL/SQL procedure successfully completed.

 

shall@ORCL>analyze table zhong compute statistics;

Table analyzed.

sys@ORCL> select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                1630           34

 

----删除然后导出表

shall@ORCL>delete zhong where id>50000;

950000 rows deleted.

[oracle@zyx ~]$ exp \'/ as sysdba\' tables=shall.zhong file=zhong.dmp log=zhong.log

Export: Release 11.2.0.4.0 - Production on Sun May 1 18:34:39 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...

Current user changed to SHALL

. . exporting table                          ZHONG      50000 rows exported

Export terminated successfully without warnings.

[oracle@zyx ~]$

 

----drop原表

shall@ORCL>drop table zhong;

Table dropped.

 

----导入表

[oracle@zyx ~]$ imp \'/ as sysdba\' tables=zhong file=zhong.dmp fromuser=shall touser=shall;

Import: Release 11.2.0.4.0 - Production on Sun May 1 18:37:44 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V11.02.00 via conventional path

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set

. importing SHALL's objects into SHALL

. . importing table                        "ZHONG"      50000 rows imported

Import terminated successfully without warnings.

[oracle@zyx ~]$

----未刷新统计信息时

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                1630            0

 

----刷新统计信息后

shall@ORCL>analyze table zhong compute statistics;

Table analyzed.

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 110         1554

 

---- BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块

 

 

5. deallocate unused

alter table table_name deallocate unused;

注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置。

truncate table 后,有可能表空间仍没有释放,可以使用如下语句:

            alter table 表名称 deallocate   UNUSED KEEP 0;

例如:

alter table tablename deallocate UNUSED KEEP 0;

或者:

truncate table  tablename DROP STORAGE; 才能释放表空间

注意:如果不加KEEP 0的话,表空间是不会释放的。

实验:接上面导入导出实验

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 110         1554

 

----开始整理

sys@ORCL>alter table shall.zhong deallocate unused keep 0;

Table altered.

 

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 110         1554

 

sys@ORCL>analyze table shall.zhong compute statistics;

Table analyzed.

 

----整理之后

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 110           18

 

6. truncate

尽量使用truncate (如:truncate t1)

实验:接上面实验

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                 110           18

 

sys@ORCL>truncate table shall.zhong;

Table truncated.

 

sys@ORCL>analyze table shall.zhong compute statistics;

Table analyzed.

 

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                   0          128

 

sys@ORCL>alter table shall.zhong deallocate unused keep 0;

Table altered.

 

sys@ORCL>analyze table shall.zhong compute statistics;

Table analyzed.

 

sys@ORCL>select table_name,blocks,empty_blocks from dba_tables  where table_name='ZHONG';

TABLE_NAME                         BLOCKS EMPTY_BLOCKS

------------------------------ ---------- ------------

ZHONG                                   0           24


以上是“数据库中如何降低高水位”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 数据库中如何降低高水位

本文链接: https://www.lsjlt.com/news/64874.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库中如何降低高水位
    这篇文章主要为大家展示了“数据库中如何降低高水位”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何降低高水位”这篇文章吧。 降低高水位方法1. mov...
    99+
    2022-10-19
  • 【TABLESPACE】怎么去降低数据文件的高水位呢(BLOCK_ID)
    http://blog.itpub.net/29487349/viewspace-2143418/ 这边文章说了怎么收缩表空间,那么有的时候会出现以下情况,也就是我们查询表空间空间空闲很多,但执...
    99+
    2022-10-18
  • 分析Oracle表数据库高水位及shrink操作
    这篇文章主要介绍“分析Oracle表数据库高水位及shrink操作”,在日常操作中,相信很多人在分析Oracle表数据库高水位及shrink操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-18
  • 数据库表空间高水位的知识有哪些
    本篇内容主要讲解“数据库表空间高水位的知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库表空间高水位的知识有哪些”吧!一、对于手动段空间管理(MSS...
    99+
    2022-10-19
  • Oracle数据库高水位释放——LOB字段空间释放
    在Oracle数据库中表随着数据增长,所占磁盘容量也会增长,当表中数据不再需要时,对表进行delete操作,表中代表所占空间的标志-高水位,不会随着数据删除而下降,高水位没有变化,即使删除了数据库,表所占...
    99+
    2022-10-18
  • JavaScript重构技巧中如何降低函数复杂度
    这篇文章给大家介绍JavaScript重构技巧中如何降低函数复杂度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的...
    99+
    2022-10-19
  • 数据库中如何修改数据文件的位置
    这篇文章主要为大家展示了“数据库中如何修改数据文件的位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何修改数据文件的位置”这篇文章吧。【1】查看数据...
    99+
    2022-10-18
  • Redhat6.4如何安装Oracle10.2.0.5 64位数据库
    这篇文章主要介绍Redhat6.4如何安装Oracle10.2.0.5 64位数据库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实验环境: 操作系统:Redhat 6.4 64位 ...
    99+
    2022-10-19
  • php数据库读取的数据错位如何解决
    今天小编给大家分享一下php数据库读取的数据错位如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。问题描述我们先看一个简...
    99+
    2023-07-05
  • 如何修改gitlab数据库存储位置
    GitLab是一个流行的开源代码托管平台,许多企业和开发者使用它来管理他们的代码。GitLab提供了可以自定义的存储位置,这意味着您可以将GitLab数据库的存储位置指定为您选择的任何位置。在本文中,我们将向您展示如何修改GitLab数据库...
    99+
    2023-10-22
  • php数据库如何修改字段位置
    本文小编为大家详细介绍“php数据库如何修改字段位置”,内容详细,步骤清晰,细节处理妥当,希望这篇“php数据库如何修改字段位置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先,我们需要连接到数据库。在连接到数...
    99+
    2023-07-06
  • 如何看sql数据库的存储位置
    要查看SQL数据库的存储位置,可以按照以下步骤进行操作:1. 打开SQL Server Management Studio(SSMS...
    99+
    2023-08-30
    sql数据库
  • 如何遵循MySQL设计规约,提高技术同学的数据库设计水平?
    如何遵循MySQL设计规约,提高技术同学的数据库设计水平?导语:MySQL是一种开源的关系型数据库管理系统,在技术领域有广泛的应用。良好的数据库设计是构建高效、可靠系统的重要基础。本文将介绍如何遵循MySQL设计规约,提高技术同学的数据库设...
    99+
    2023-10-22
    MySQL设计规约:MySQL 规约 技术同学:技术 同学 数据库设计:数据库
  • 如何查看sql数据库的存储位置
    要查看SQL数据库的存储位置,可以执行以下步骤:1. 打开SQL Server Management Studio(SSMS)或其他...
    99+
    2023-09-22
    sql数据库
  • 如何在redis数据库中查找key在内存中的位置
    这篇文章主要介绍“如何在redis数据库中查找key在内存中的位置”,在日常操作中,相信很多人在如何在redis数据库中查找key在内存中的位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-18
  • 如何提高自己的MySQL数据库技能以获得更好的职位?
    如何提高自己的MySQL数据库技能以获得更好的职位?MySQL是一种广泛应用于开发和管理数据库的关系型数据库管理系统,具备高可靠性、高性能、便捷的特点,因而在各种企业应用中被广泛使用。对于想要在数据库领域取得更好职位和更高薪资的人来说,掌握...
    99+
    2023-10-22
    SQL查询优化 MySQL学习计划 数据库优化技巧
  • 数据库中如何高效率删除大表历史数据
    这篇文章主要介绍数据库中如何高效率删除大表历史数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!清理大表历史数据通过将非分区表Online Redefinition转换为以删除条件为...
    99+
    2022-10-18
  • SQL无法定位数据库文件如何解决
    当无法定位数据库文件时,可以尝试以下解决方法:1. 检查数据库文件路径是否正确:确认数据库文件路径是否正确,并确保路径中没有拼写错误...
    99+
    2023-09-22
    SQL 数据库
  • 如何提高数据库的速度
    这篇文章主要介绍“如何提高数据库的速度”,在日常操作中,相信很多人在如何提高数据库的速度问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何提高数据库的速度”的疑惑有所帮助!接...
    99+
    2022-10-18
  • 如何提高数据库的性能?
    随着数据量的不断增加和业务需求的不断扩展,数据库的性能优化已成为任何一个企业的重要任务之一。本文将为读者介绍一些提高数据库性能的相关技术和方法。 一、选择合适的数据库引擎常见的数据库引擎包括MySQL、Oracle、SQL Server等。...
    99+
    2023-05-14
    索引: 为数据库表中的列创建索引 可以大大提高查询速度。 规范化:将数据库设计规范化可以减少冗余数据 提高更新和插入操作
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作