Oracle查看段信息show_space()

Oracle存储过程查看段信息

/**
  查看段信息的存储过程show_space()
  此版主要查看当前用户下的信息。
  如果要察看其他用户信息需要修改
  这里
select t.segment_space_management into p_space
from user_tablespaces t , user_segments s
where s.tablespace_name = t.tablespace_name
and segment_name = p_segname
--and s.owner = p_owner
and s.segment_type = p_type ;

select t.segment_space_management into p_space
from dba_tablespaces t , dba_segments s
where s.tablespace_name = t.tablespace_name
and segment_name = p_segname
and s.owner = p_owner
and s.segment_type = p_type ;
并赋予current_user 查询dba_tablespace,dba_segments 权限
grant select on dba_tablespace,dba_segments to current_user
*/

create or replace procedure show_space
( p_segname_1 in varchar2,
--p_space in varchar2 default 'MANUAL',
p_type_1 in varchar2 default 'TABLE' ,
p_analyzed in varchar2 default 'N',
p_owner_1 in varchar2 default user)
AS
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
p_space varchar2(10);

l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;

l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;

procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin
p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;

if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
end if;

if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
end if;

if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
p_type := 'CLUSTER';
end if;

select t.segment_space_management into p_space
from user_tablespaces t , user_segments s
where s.tablespace_name = t.tablespace_name
and segment_name = p_segname
--and s.owner = p_owner
and s.segment_type = p_type ;

 

dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );

if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );

p( 'Free Blocks', l_free_blks );
end if;

p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );


/*IF the segment is analyzed */
if (p_analyzed = 'Y' OR p_space = 'auto' OR p_space = 'AUTO') then
dbms_space.space_usage(segment_owner => p_owner ,
segment_name => p_segname ,
segment_type => p_type ,
unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
p( '0% -- 25% free space blocks', l_fs1_blocks);
p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
p( '50% -- 75% free space bytes', l_fs3_bytes);
p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);

end if;

end;
/*
例  ASSM:自动段空间管理
非ASSM 类型的表:
SQL> exec show_space('t');

ASSM 类型的 表

SQL> exec show_space('t','auto');
Total Blocks............................512
Total Bytes.............................4194304
Unused Blocks...........................78
Unused Bytes............................638976
Last Used Ext FileId....................9
Last Used Ext BlockId...................25608
Last Used Block.........................50

PL/SQL procedure successfully completed.


ASSM 类型的索引


SQL> exec show_space('t_index','auto','i');
Total Blocks............................80
Total Bytes.............................655360
Unused Blocks...........................5
Unused Bytes............................40960
Last Used Ext FileId....................9
Last Used Ext BlockId...................25312
Last Used Block.........................3

PL/SQL procedure successfully completed.


对analyze 过的segment 可以这样

SQL> exec show_space('t','auto','T','Y');
Total Blocks............................512
Total Bytes.............................4194304
Unused Blocks...........................78
Unused Bytes............................638976
Last Used Ext FileId....................9
Last Used Ext BlockId...................25608
Last Used Block.........................50
*************************************************
The segment is analyzed
0% -- 25% free space blocks.............0
0% -- 25% free space bytes..............0
25% -- 50% free space blocks............0
25% -- 50% free space bytes.............0
50% -- 75% free space blocks............0
50% -- 75% free space bytes.............0
75% -- 100% free space blocks...........0
75% -- 100% free space bytes............0
Unused Blocks...........................0
Unused Bytes............................0
Total Blocks............................418
Total bytes.............................3424256

PL/SQL procedure successfully completed.

参考:http://www.itpub.net/viewthread.php?tid=239697
*/

<think>嗯,用户问的是Oracle 19c中shared_pool_size设置为0的影响和正确配置方法。我需要先理解shared_pool的作用。记得shared pool主要用于缓存SQL语句、执行计划、数据字典等信息,对性能很重要。如果设置为0的话,可能Oracle会自己管理这个参数?但不确定,得查一下Oracle的文档或者相关引用。 根据引用[2]提到的,shared_pool_size设置为0时,实际大小可能由SGA自动管理决定。也就是说,Oracle会自动分配内存给shared pool。不过,如果自动管理不合适,可能导致性能问题,比如硬解析增加,库缓存命中率下降。这时候需要手动调整。 然后用户可能想知道具体的影响,比如设置为0是否可行,会不会有什么问题。根据引用[3],调整shared_pool_size和其他参数可以解决expdp的问题,说明正确配置的重要性。所以设置为0可能在某些情况下可行,但生产环境还是建议手动设置合理值。 接下来配置建议部分,需要结合Oracle的版本特性。19c可能推荐使用自动内存管理(AMM),但shared_pool_size设为0的话,可能由AMM自动调整。不过,对于高并发或复杂查询的系统,手动指定更稳妥。需要参考最佳实践,比如预留系统内存的15%-25%,或者根据v$shared_pool_advice的建议调整。 可能还需要考虑与SGA其他组件的关系,比如db_cache_size和java_pool_size。引用[2]提到有些参数初始化为0,可能也是由自动管理机制控制。因此,整体内存分配需要平衡。 最后,用户可能需要监控方法,比如用v$sgastat查看当前使用情况,或者用AWR报告分析库缓存命中率。这些工具能帮助确定是否需要调整shared_pool_size。 总结起来,回答的结构应该是先讲设置为0的影响,然后给出配置建议,最后提供监控方法。确保引用的资料支持每个观点,比如引用[2]说明设置为0的实际行为,引用[3]说明调整参数的重要性。同时要提醒用户在生产环境中谨慎,避免自动管理带来的不确定性。</think>### Oracle 19c中`shared_pool_size`设置为0的影响及配置建议 #### 一、`shared_pool_size=0`的影响 1. **自动内存管理** - 当`shared_pool_size`设置为0时,Oracle会通过**自动共享内存管理(ASMM)**或**自动内存管理(AMM)**动态分配共享池大小[^2][^3]。 - 实际共享池大小由`SGA_TARGET`或`MEMORY_TARGET`参数决定,但可能导致以下问题: - **库缓存争用**:频繁的SQL解析可能导致共享池碎片化,影响性能[^1]。 - **硬解析增加**:若共享池过小,无法缓存常用SQL执行计划,增加CPU负载。 2. **性能风险** - **ORA-04031错误**:共享池不足时,可能抛出内存分配错误。 - **响应时间波动**:动态调整可能在高负载时引发延迟。 #### 二、合理配置建议 1. **手动指定`shared_pool_size`**(适用于生产环境) - **基础规则**:通常设置为SGA总大小的10%-25%。 - **计算公式**: $$ \text{shared\_pool\_size} = \frac{\text{SGA\_TARGET}}{4} \pm 20\% $$ - **调整示例**: ```sql ALTER SYSTEM SET shared_pool_size = 2G SCOPE=BOTH; ``` 2. **结合自动管理优化** - 若使用AMM/ASMM,需确保`SGA_TARGET`足够大,并设置`shared_pool_size`下限: ```sql ALTER SYSTEM SET shared_pool_size = 1G; -- 最小保障值 ``` 3. **监控与调优工具** - 查询当前使用情况: ```sql SELECT * FROM v$sgastat WHERE pool = 'shared pool'; ``` - 使用`v$librarycache`分析库缓存命中率(目标>95%): $$ \text{命中率} = 1 - \frac{\text{reloads}}{\text{pins}} $$ #### 三、配置验证步骤 1. 检查当前配置: ```sql SHOW PARAMETER shared_pool_size; ``` 2. 监控碎片化情况: ```sql SELECT free_space, avg_chunk_size FROM v$shared_pool_reserved; ``` 3. 使用AWR报告分析共享池的“Load Profile”和“Instance Efficiency Percentages”[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值