测试alter table shrink space compact cascade及学习user_tables相关列的含义

2023-11-15

SQL> alter table test_shrink enable row movement;--alter table shrink space须开启行移动

Table altered.

SQL> select table_name,blocks,empty_blocks,num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss'),row_movement from user_tables where table_name='TEST_SHRINK';--查测试表相关信息

TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS TO_CHAR(LAST_ANALYZ ROW_MOVE
------------------------------ ---------- ------------ ---------- ------------------- -------- --blocks是真正使用的块数 num_rows 表中行的记录数
TEST_SHRINK ENABLED

SQL> select segment_name,blocks from user_segments where segment_type='TABLE' and segment_name='TEST_SHRINK';--查询测试表segment

SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TEST_SHRINK 12288

SQL> exec dbms_stats.gather_table_stats(ownname=>NULL,tabname=>'TEST_SHRINK',cascade=>true);--分析下测试表

PL/SQL procedure successfully completed.

SQL> select table_name,blocks,empty_blocks,num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss'),row_movement from user_tables where table_name='TEST_SHRINK';--再次查看测试表相关信息

TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS TO_CHAR(LAST_ANALYZ ROW_MOVE
------------------------------ ---------- ------------ ---------- ------------------- --------
TEST_SHRINK 12040 0 862741 2010-08-28 14:17:40 ENABLED

SQL> select segment_name,blocks from user_segments where segment_type='TABLE' and segment_name='TEST_SHRINK';

SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TEST_SHRINK 12288

SQL> delete from test_shrink where rownum<=200000;--删除20w记录从测试表

200000 rows deleted.

SQL> commit;

Commit complete.

SQL> select segment_name,blocks from user_segments where segment_type='TABLE' and segment_name='TEST_SHRINK';--测试表segment,发现删除segment没有变化哟

SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TEST_SHRINK 12288

SQL> alter table test_shrink shrink space;--没变化是吧,用alter shrink试下看看测试表segment有变化吗

Table altered.

SQL> select segment_name,blocks from user_segments where segment_type='TABLE' and segment_name='TEST_SHRINK';---这下测试表(blocks表示分配给测试表segment的block个数)segment变了吧,从原来的12288块到8952块,少

了近4000块

SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TEST_SHRINK 8952

SQL> exec dbms_stats.gather_table_stats(ownname=>NULL,tabname=>'TEST_SHRINK',cascade=>true);

PL/SQL procedure successfully completed.

SQL> select table_name,blocks,empty_blocks,num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss'),row_movement from user_tables ---user_tables中的blocks总是小于user_segments的blockswhere

table_name='TEST_SHRINK';--

TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS TO_CHAR(LAST_ANALYZ ROW_MOVE
------------------------------ ---------- ------------ ---------- ------------------- --------
TEST_SHRINK 8807 0 659108 2010-08-28 14:35:01 ENABLED

SQL>


小结:

小结:
1,alter table shrink space compact cascade;对大表或大索引操作会产生大量日志
2,alter table shrink space;--加上compact选项仅重新整理segment 空间,并压缩表的记录在以后进行release空间.但数据库并不调整hwm及释放空间.为了释放空间.你必须再发布alter table shrink space
--compact用于把一个长操作分割为两个较短的操作
--须开启行移动
--cascade会级联对其依赖对象(比如上面的索引)进行压紧操作
3,它的一些限制条件:
在集群表,long列的表不能采用shrink 操作
在基于函数索引或位图联接索引不支持shrink操作
就是你指定了cascade选项,也不能shrink 索引组织表的映射表
压缩表不能用shrink操作
构建了on commit物化视图的主表,在shrink操作后,rowid实化视图必须重建
4,alter table shrink space;--仅可对automatic segment management tablespace方式的table,index_orginized table or overflow segment,index,partition,lob segment,mv,mv log
--压缩segment,调整hwm,并马上释放空间


5,user_tables某些列(请查对官方手册,若标有*标记,表示此列须收集统计信息才会被填充,比如num_rows,所以及时分析表很重要啊
blocks表示使用的块数 empty_blocks 表示从未使用的块数 avg_row_len 表示每个行的长度(以byte计)
nested 表示是否为nested table(值为y or n)
iot_type表示是否为index-orginized table(值为iot,iot_overflow,若不是iot,值为null)
temporary表示在当前会话是否仅仅看到对象上面的数据
global_stats表示(对于分区表),是收集了全表的统计信息(值为yes)还是根据分区表的基础表或子分区估计统计信息(值 为no)
duration 表示临时表中数据的保持时间(值sys$session表记录仅在会话期间保持),而值sys$transaction在commit后删除
skip_corrupt表示oracle在检查表或索引中标记为破坏状态的块,是否进行忽略处理呢(值为enabled or disabled),为了 enabled必须用dbms_repair.skip_corrupt_blocks标记坏块


---测试学习user_segment相关列含义及user_tables相关列含义,且二者字典的关联

SQL> select table_name,blocks,blocks*8/1024 mb,empty_blocks,num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss'),row_movement from user_tables where table_name='TEST_SHRINK';

TABLE_NAME BLOCKS MB EMPTY_BLOCKS NUM_ROWS TO_CHAR(LAST_ANALYZ ROW_MOVE
------------------------------ ---------- ---------- ------------ ---------- ------------------- -------- ###表有68m左右
TEST_SHRINK 8807 68.8046875 0 659108 2010-08-28 14:35:01 ENABLED

SQL> select segment_name,bytes/1024/1024 mb from user_segments where segment_name='TEST_SHRINK'; ##表有69m 左右(同上面68m 差不多)

SEGMENT_NAME MB
--------------------------------------------------------------------------------- ----------
TEST_SHRINK 69.9375

SQL> select segment_name,segment_type,initial_extent,next_extent,pct_increase,min_extents,max_extents from user_segments where segment_name='TEST_SHRINK';---请注意initial_extent列,为65536bytes,也就是一个8

block的extent,请继续对应查看user_extents字典

SQL> select segment_name,segment_type,initial_extent,next_extent,pct_increase,min_extents,max_extents,extents from user_segments where segment_name='TEST_SHRINK';##有80个extent

SEGMENT_NAME SEGMENT_TYPE INITIAL_EXTENT NEXT_EXTENT PCT_INCREASE MIN_EXTENTS MAX_EXTENTS EXTENTS
--------------------------------------------------------------------------------- ------------------ -------------- ----------- ------------ ----------- ----------- ----------
TEST_SHRINK TABLE 65536 1 2147483645 80

SQL>

SQL> select count(*) from user_extents where segment_name='TEST_SHRINK';--这不,对应上了,就是分配了80个extent为测试表segment

COUNT(*)
----------
80

SQL> select segment_name,extent_id,bytes,blocks from user_extents where segment_name='TEST_SHRINK';##oracle在分配extent时会根据不同算法可能每个extent的大小不一样,也就是每个extent包含的blocks个数不同

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 0 65536 8
TEST_SHRINK 1 65536 8
TEST_SHRINK 2 65536 8
TEST_SHRINK 3 65536 8
TEST_SHRINK 4 65536 8
TEST_SHRINK 5 65536 8
TEST_SHRINK 6 65536 8
TEST_SHRINK 7 65536 8
TEST_SHRINK 8 65536 8
TEST_SHRINK 9 65536 8
TEST_SHRINK 10 65536 8

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 11 65536 8
TEST_SHRINK 12 65536 8
TEST_SHRINK 13 65536 8
TEST_SHRINK 14 65536 8
TEST_SHRINK 15 65536 8
TEST_SHRINK 16 1048576 128
TEST_SHRINK 17 1048576 128
TEST_SHRINK 18 1048576 128
TEST_SHRINK 19 1048576 128
TEST_SHRINK 20 1048576 128
TEST_SHRINK 21 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 22 1048576 128
TEST_SHRINK 23 1048576 128
TEST_SHRINK 24 1048576 128
TEST_SHRINK 25 1048576 128
TEST_SHRINK 26 1048576 128
TEST_SHRINK 27 1048576 128
TEST_SHRINK 28 1048576 128
TEST_SHRINK 29 1048576 128
TEST_SHRINK 30 1048576 128
TEST_SHRINK 31 1048576 128
TEST_SHRINK 32 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 33 1048576 128
TEST_SHRINK 34 1048576 128
TEST_SHRINK 35 1048576 128
TEST_SHRINK 36 1048576 128
TEST_SHRINK 37 1048576 128
TEST_SHRINK 38 1048576 128
TEST_SHRINK 39 1048576 128
TEST_SHRINK 40 1048576 128
TEST_SHRINK 41 1048576 128
TEST_SHRINK 42 1048576 128
TEST_SHRINK 43 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 44 1048576 128
TEST_SHRINK 45 1048576 128
TEST_SHRINK 46 1048576 128
TEST_SHRINK 47 1048576 128
TEST_SHRINK 48 1048576 128
TEST_SHRINK 49 1048576 128
TEST_SHRINK 50 1048576 128
TEST_SHRINK 51 1048576 128
TEST_SHRINK 52 1048576 128
TEST_SHRINK 53 1048576 128
TEST_SHRINK 54 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 55 1048576 128
TEST_SHRINK 56 1048576 128
TEST_SHRINK 57 1048576 128
TEST_SHRINK 58 1048576 128
TEST_SHRINK 59 1048576 128
TEST_SHRINK 60 1048576 128
TEST_SHRINK 61 1048576 128
TEST_SHRINK 62 1048576 128
TEST_SHRINK 63 1048576 128
TEST_SHRINK 64 1048576 128
TEST_SHRINK 65 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 66 1048576 128
TEST_SHRINK 67 1048576 128
TEST_SHRINK 68 1048576 128
TEST_SHRINK 69 1048576 128
TEST_SHRINK 70 1048576 128
TEST_SHRINK 71 1048576 128
TEST_SHRINK 72 1048576 128
TEST_SHRINK 73 1048576 128
TEST_SHRINK 74 1048576 128
TEST_SHRINK 75 1048576 128
TEST_SHRINK 76 1048576 128

SEGMENT_NAME EXTENT_ID BYTES BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ----------
TEST_SHRINK 77 1048576 128
TEST_SHRINK 78 1048576 128
TEST_SHRINK 79 6225920 760

80 rows selected.

SQL> select 8*8*1024*1024 from dual;

8*8*1024*1024
-------------
67108864

SQL> select 8*8*1024 from dual;

8*8*1024
----------
65536
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试alter table shrink space compact cascade及学习user_tables相关列的含义 的相关文章

  • 如何从 Databricks Delta 表中删除列?

    我最近开始发现 Databricks 并遇到了需要删除增量表的特定列的情况 当我使用 PostgreSQL 时 它就像 ALTER TABLE main metrics table DROP COLUMN metric 1 我正在浏览 Da
  • SQL,帮助进行有关用户年龄的小查询

    我有一个包含注册用户的表 其中我将年份保存为 varchar 值 只是因为我只花了一年 我想创建包含年龄的饼图 以显示哪些用户更有可能注册 下面的查询给出了表中出现超过 5 次的用户年龄计数 以避免结果过小 虽然这些小结果低于 having
  • Oracle中如何转义单引号? [复制]

    这个问题在这里已经有答案了 我有一列包含某些存储为文本字符串的表达式 其中包括单个引号 例如 错过的交易 包括引号 发生这种情况时如何使用 where 子句 select from table where reason missed tra
  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 在tomcat中显示Spring-security的SQL错误

    我使用 spring security 框架创建了一个 Web 应用程序 我设置了一个数据库来存储用户及其角色 但 tomcat 给出以下错误 17 sep 2010 11 56 14 org springframework beans f
  • PIVOT 运算符中指定的列名“FirstName”与 PIVOT 参数中的现有列名冲突

    当我尝试替换时收到以下错误消息null to zero PIVOT 运算符中指定的列名 jan 与 PIVOT 参数中的现有列名称 查询如下 select from select isnull jan 0 isnull feb 0 sum
  • 将两个sql查询合并为一个查询

    如何组合以下 2 个查询以便获得两列 PAYMODE 和付款类型 两个查询都很相似 并且针对同一个表 将两个 sql 查询合并为一个查询 这样我就不需要执行两个单独的查询 SELECT ETBL DESC TXT as PAYMODE FR
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • 规范“毒”方式真的值得吗? (3NF)

    我正处于数据库设计的早期阶段 所以还没有最终的结果 并且我正在为具有可选标签的线程使用 TOXI 3表设计 但我忍不住觉得加入是并不是真的必要 也许我只需要依赖我的简单标签列posts我可以在其中存储类似 varchar 的表
  • 删除重复的 SQL 记录以允许唯一键

    我在 MYSQL 数据库中有一个表 销售 该表理应强制执行唯一约束以防止重复 事实证明 首先删除欺骗并设置约束有点棘手 表结构 简化 id 唯一 autoinc 产品编号 目标是强制product id 的唯一性 我想要应用的重复数据删除策
  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b
  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 如何查询多对多表(一个表的值成为列标题)

    给定此表结构 我想展平多对多关系 并将一个表的名称字段中的值设置为列标题 并将同一表中的数量设置为列值 目前可行的想法是将值放入字典 哈希表 中并用代码表示这些数据 但我想知道是否有 SQL 方法可以做到这一点 我还使用 Linq to S
  • sqlite 插入表中 select * from

    我需要在 Android 应用程序中将数据从一个表移动到另一个表 我想使用以下sql insert into MYTABLE2 select id STATUS risposta DATETIME now data ins from MYT
  • 如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?

    我有一些 SQL 几乎可以做我想做的事情 我正在使用三个表 Users UserPhoneNumbers 和 UserPhoneNumberTypes 我正在尝试获取用户列表及其电话号码以供导出 数据库本身很旧并且存在一些完整性问题 我的问
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • 如果不存在则插入数据(来自 2 个表),否则更新

    再会 我有3张桌子 tbl仓库产品 ProductID ProductName ProductCode Quantity tbl分公司产品 ProductID ProductCode ProductCode Quantity Locatio

随机推荐