数码资讯
oracle表碎片整理操作的详细解决方案
许多数据块的高水位线下(HWL)没有数据,但扫描整个表时,必须扫描的高水位线的数据块,也就是说,甲骨文已经做了很多无用的工作。所以,Oracle提供了缩小空间碎片整理功能的指标,可用于重建在线碎片整理。一般来说,DBA,通常用于DML操作应定期保养,同时要注意及时更新统计信息。 1:准备测试数据,利
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
许多数据块的高水位线下(HWL)没有数据,但扫描整个表时,必须扫描的高水位线的数据块,也就是说,甲骨文已经做了很多无用的工作。所以,Oracle提供了缩小空间碎片整理功能的指标,可用于重建在线碎片整理。一般来说,DBA,通常用于DML操作应定期保养,同时要注意及时更新统计信息。
1:准备测试数据,利用人力资源,创造T1表,30w左右的数据插入,创造共同的指标的基础上object_id,占存储空间34m
复制代码代码如下所示:
SQL> Conn /数据库
它已经连接了。
SQL >选择default_tablespace从dba_users么= 'hr;
default_tablespace
------------------------------------------------------------
用户
SQL >连接人力资源/人力资源
它已经连接了。
从T1插入到t1选择*;
创建了74812行代码。
从T1插入到t1选择*;
创建了149624行代码。
提交;
提交完成。
SQL >创建索引idx_t1_id T1(object_id);
已创建索引。
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
从T1中选择计数(1);
伯爵(1)
----------
二十九万九千二百四十八
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 't1;
总和(字节) 1024 / 1024
雇佣
三十四点0625
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 'idx_t1_id;
总和(字节) 1024 / 1024
雇佣
六
二:有多少空间可以用来估计高水位线下的桌子值越低,表的利用率越接近高水位线。整个表扫描的用处较小。
的dbms_stats包不能empty_blocks统计,所以你需要统计信息的收集与分析指令
复制代码代码如下所示:
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四百三十亿二千零二十九万九千二百四十八
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四千三百零二亿五千零二十九万九千二百四十八
SQL> Col table_name A20
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 5.07086182
三:查看执行计划,所有表扫描需要消耗CPU 1175。
复制代码代码如下所示:
从T1中解释选择*的计划;
已经解释过了。
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
--------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | 299k | 28m | 1175(00:00:15 1)| |
1表访问全| T1 | | | 299k | 28m | 1175(00:00:15 1)| |
--------------------------------------------------------------------------
四:删除大部分数据,收集统计信息,全表扫描仍需消耗CPU 1168。
复制代码代码如下所示:
SQL >删除从T1,object_id > 100;
删除了298852行。
提交;
提交完成。
从T1中选择计数(*);
计数(*)
----------
三百九十六
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四亿三千零二十五万零三百九十六
从T1中解释选择*的计划;
已经解释过了。
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | | | 396 29700 1168(1)| 00:00:15 |
1表访问全| T1 | | | | | 396 29700 1168(1)| 00:00:15 |
--------------------------------------------------------------------------
五:高水位线下还有多少空间没有数据,但需要在全表扫描中做无用的工作数据。
复制代码代码如下所示:
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 33.5791626
六:整理表收集统计信息
复制代码代码如下所示:
表T1启用行移动;
桌子已经换了。
缩表空间级联;
桌子已经换了。
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 't1;
总和(字节) 1024 / 1024
雇佣
125。
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 'idx_t1_id
';
总和(字节) 1024 / 1024
雇佣
0625。
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 33.5791626
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
在这个时候,只有0.1的无用的工作了。在执行计划中,全表扫描也只需要CPU 3。
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
t1.010738373
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
--------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | | | 396 29700 3(0)| 00:00:01 |
1表访问全| T1 | | | | | 396 29700 3(0)| 00:00:01 |
--------------------------------------------------------------------------
总共有50只空块5块,最明显的empty_blocks信息过时。
SQL >选择块,empty_blocks,从user_tables哪里table_name = 't1num_rows;
empty_blocks num_rows块
--------------------------------
五十五万零三百九十六
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks,从user_tables哪里table_name = 't1num_rows;
empty_blocks num_rows块
--------------------------------
五万三千三百九十六
1:准备测试数据,利用人力资源,创造T1表,30w左右的数据插入,创造共同的指标的基础上object_id,占存储空间34m
复制代码代码如下所示:
SQL> Conn /数据库
它已经连接了。
SQL >选择default_tablespace从dba_users么= 'hr;
default_tablespace
------------------------------------------------------------
用户
SQL >连接人力资源/人力资源
它已经连接了。
从T1插入到t1选择*;
创建了74812行代码。
从T1插入到t1选择*;
创建了149624行代码。
提交;
提交完成。
SQL >创建索引idx_t1_id T1(object_id);
已创建索引。
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
从T1中选择计数(1);
伯爵(1)
----------
二十九万九千二百四十八
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 't1;
总和(字节) 1024 / 1024
雇佣
三十四点0625
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 'idx_t1_id;
总和(字节) 1024 / 1024
雇佣
六
二:有多少空间可以用来估计高水位线下的桌子值越低,表的利用率越接近高水位线。整个表扫描的用处较小。
的dbms_stats包不能empty_blocks统计,所以你需要统计信息的收集与分析指令
复制代码代码如下所示:
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四百三十亿二千零二十九万九千二百四十八
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四千三百零二亿五千零二十九万九千二百四十八
SQL> Col table_name A20
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 5.07086182
三:查看执行计划,所有表扫描需要消耗CPU 1175。
复制代码代码如下所示:
从T1中解释选择*的计划;
已经解释过了。
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
--------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | 299k | 28m | 1175(00:00:15 1)| |
1表访问全| T1 | | | 299k | 28m | 1175(00:00:15 1)| |
--------------------------------------------------------------------------
四:删除大部分数据,收集统计信息,全表扫描仍需消耗CPU 1168。
复制代码代码如下所示:
SQL >删除从T1,object_id > 100;
删除了298852行。
提交;
提交完成。
从T1中选择计数(*);
计数(*)
----------
三百九十六
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks num_rows,从user_tables哪里table_name = 't1;
empty_blocks num_rows块
--------------------------------
四亿三千零二十五万零三百九十六
从T1中解释选择*的计划;
已经解释过了。
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | | | 396 29700 1168(1)| 00:00:15 |
1表访问全| T1 | | | | | 396 29700 1168(1)| 00:00:15 |
--------------------------------------------------------------------------
五:高水位线下还有多少空间没有数据,但需要在全表扫描中做无用的工作数据。
复制代码代码如下所示:
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 33.5791626
六:整理表收集统计信息
复制代码代码如下所示:
表T1启用行移动;
桌子已经换了。
缩表空间级联;
桌子已经换了。
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 't1;
总和(字节) 1024 / 1024
雇佣
125。
SQL >选择的总和(字节)/ 1024 / 1024 dba_segments哪里segment_name = 'idx_t1_id
';
总和(字节) 1024 / 1024
雇佣
0625。
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
T1 33.5791626
SQL> exec dbms_stats.gather_table_stats('hr ','t1,级联= >真的);
已成功完成PL/sql过程。
在这个时候,只有0.1的无用的工作了。在执行计划中,全表扫描也只需要CPU 3。
SQL >选择table_name,
2(块* 8192 1024 1024)—
3(num_rows * avg_row_len / 1024 / 1024)数据低于HWM MB
4从user_tables
5在table_name = 't1;
table_name数据低于HWM MB
---------------------------------------------
t1.010738373
SQL SELECT * FROM表>>(dbms_xplan。显示);
plan_table_output
--------------------------------------------------------------------------------
计划哈希值:3617692013
--------------------------------------------------------------------------
我的名字|操作| | |行| |字节成本(CPU)时间| |
--------------------------------------------------------------------------
| 0 | SELECT语句| | | | 396 29700 3(0)| 00:00:01 |
1表访问全| T1 | | | | | 396 29700 3(0)| 00:00:01 |
--------------------------------------------------------------------------
总共有50只空块5块,最明显的empty_blocks信息过时。
SQL >选择块,empty_blocks,从user_tables哪里table_name = 't1num_rows;
empty_blocks num_rows块
--------------------------------
五十五万零三百九十六
分析表t1计算统计;
桌子已经被分析过了。
SQL >选择块,empty_blocks,从user_tables哪里table_name = 't1num_rows;
empty_blocks num_rows块
--------------------------------
五万三千三百九十六
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。