Oracle 数据库分析SQL及使用空间优化

2022/7/1 2:21:18

本文主要是介绍Oracle 数据库分析SQL及使用空间优化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

查看表空间使用率

 1 --查看表空间使用率
 2 SELECT * FROM ( 
 3 SELECT D.TABLESPACE_NAME "表空间名", 
 4         SPACE || 'M' "表空间大小", 
 5         BLOCKS "SUM_BLOCKS", 
 6         SPACE - NVL (FREE_SPACE, 0) || 'M' "已使用空间", 
 7         ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) || '%' "使用率", 
 8         FREE_SPACE || 'M' "空闲空间" 
 9    FROM (  SELECT TABLESPACE_NAME, 
10                   ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, 
11                   SUM (BLOCKS) BLOCKS 
12              FROM DBA_DATA_FILES 
13          GROUP BY TABLESPACE_NAME) D, 
14         (  SELECT TABLESPACE_NAME, 
15                   ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE 
16              FROM DBA_FREE_SPACE 
17          GROUP BY TABLESPACE_NAME) F 
18   WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
19  UNION ALL                                                           
20  SELECT D.TABLESPACE_NAME "表空间名", 
21         SPACE || 'M' "表空间大小", 
22         BLOCKS SUM_BLOCKS, 
23         USED_SPACE || 'M' "已使用空间", 
24         ROUND( NVL(USED_SPACE, 0) / SPACE * 100, 2) || '%' "使用率", 
25         NVL(FREE_SPACE, 0) || 'M' "空闲空间" 
26    FROM (  SELECT TABLESPACE_NAME, 
27                   ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, 
28                   SUM (BLOCKS) BLOCKS 
29              FROM DBA_TEMP_FILES 
30          GROUP BY TABLESPACE_NAME) D, 
31         (  SELECT TABLESPACE_NAME, 
32                   ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE, 
33                   ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE 
34              FROM V$TEMP_SPACE_HEADER 
35          GROUP BY TABLESPACE_NAME) F 
36    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
37    ORDER BY 1)  
38  WHERE TABLESPACE_NAME IN ('SYSAUX','SYSTEM','UNDOTBS1','TEMP'); 

检查表空间最大的段

1 --检查表空间最大的段
2 SELECT *
3 FROM (SELECT bytes, segment_name, segment_type, owner
4 FROM dba_segments
5 WHERE tablespace_name = 'SYSAUX' --表空间
6 ORDER BY bytes DESC)
7 WHERE ROWNUM < 10;

收缩/释放表空间

1 --释放表空间
2 select a.file#, a.name, a.bytes/1024/1024 "Current(MB)",
3   ceil(HWM * a.block_size)/1024/1024 "ResizeTo(MB)",
4   (a.bytes - HWM * a.block_size)/1024/1024 "Release(MB)",
5   'alter database datafile '''||a.name||''' resize '|| ceil(HWM * a.block_size/1024/1024) || 'M;' "Resize CMD"
6 from v$datafile a,
7   (select file_id, max(block_id+blocks-1) HWM from dba_extents group by file_id) b
8 where a.file# = b.file_id(+) and (a.bytes - HWM *block_size)>0 order by 5;

 SYSTEM  SYSAUX 等表空间不是自动管理的表空间(ASSM), 不支持收缩表, 支持resize表空间 

--收缩表空间
ALTER DATABASE DATAFILE 'D:\ora_tablespace\XXXX.dbf' RESIZE 1024M;

收缩表/表空间

--语法总结:

ALTER TABLE <table_name> ENABLE ROW MOVEMENT   -->前提条件

ALTER TABLE <table_name> SHRINK SPACE [ <NULL> | COMPACT | CASCADE ];

ALTER TABLE <table_name> SHRINK SPACE COMPCAT; -->缩小表和索引,不移动高水位线,不释放空间

ALTER TABLE <table_name> SHRINK SPACE;         -->收缩表,降低高水位线;

ALTER TABLE <table_name> SHRINK SPACE CASCADE; -->收缩表,降低高水位线,并且相关索引也要收缩一下

ALTER TABLE <table_name> MODIFY LOB (lob_column) (SHRINK SPACE); -->收缩LOB段

ALTER INDEX <indx_name> SHRINK SPACE;              -->索引段的收缩,同表段
--收缩普通表,批量脚本

select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space cascade;' from user_tables;

select'alter index '||index_name||' shrink space;' from user_indexes;

查看对象/Segment占用空间

--查看对象/Segment占用空间
SELECT * from (
  SELECT segment_name,sum(bytes)/1024/1024 total_mb,tablespace_name 
  FROM dba_segments 
  WHERE tablespace_name in ('SYSTEM','SYSAUX')
  GROUP BY segment_name,tablespace_name
  ORDER BY 2 desc)
WHERE rownum <=20;

SELECT occupant_name "Item",space_usage_kbytes/1024 "Space Used (MB)",schema_name "Schema",move_procedure "Move Procedure"
FROM v$sysaux_occupants
ORDER BY 2 desc;

SELECT segment_name,sum(bytes)/1024/1024 MB 
FROM user_segments 
--WHERE segment_name=UPPER('aud$') 
GROUP BY segment_name
ORDER BY 2 desc;

SELECT owner,segment_name,segment_type,sum(bytes)/1024/1024 "size(M)"
FROM dba_extents
WHERE tablespace_name = 'SYSAUX'
GROUP BY owner,segment_name,segment_type
ORDER BY 4 desc;

 



这篇关于Oracle 数据库分析SQL及使用空间优化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程