Assessing Object Ownership and Storage Consumption in Oracle Database
Shows the distribution of objects and data across all schemas.
Which schemas are taking up all of the space?
SQL Code
1set pages 999
2col "size MB" format 999,999,999
3col "Objects" format 999,999,999
4select obj.owner "Owner"
5, obj_cnt "Objects"
6, decode(seg_size, NULL, 0, seg_size) "size MB"
7from (select owner, count(*) obj_cnt from dba_objects group by owner) obj
8, (select owner, ceil(sum(bytes)/1024/1024) seg_size
9 from dba_segments group by owner) seg
10where obj.owner = seg.owner(+)
11order by 3 desc ,2 desc, 1
12/
Sample Oracle Output:
1Owner Objects size MB
2------------------------------ ------------ ------------
3ANDY 219 46,323
4SYS 22,923 706
5SYSMAN 1,341 49
6XDB 680 49
7MDSYS 896 33
8SYSTEM 454 23
9OLAPSYS 720 16
10WMSYS 242 7
11CTXSYS 339 5
12EXFSYS 281 4
13DBSNMP 46 2
14ORDSYS 1,720 1
15DMSYS 189 1
16OUTLN 8 1
17SCOTT 6 1
18TSMSYS 3 1
19PUBLIC 19,990 0
20ORDPLUGINS 10 0
21
2218 rows selected.
23
24SQL>
Purpose:
- To investigate database space usage at the owner level, providing insights into which owners are consuming the most storage space and how many objects they own. This aids in identifying potential space issues, optimizing storage allocation, and planning for future growth.
Breakdown:
Formatting Output:
* `set pages 999`: Adjusts display settings to accommodate potentially large results.
* `col "size MB" format 999,999,999`, `col "Objects" format 999,999,999`: Formats columns for readability and large numbers.
Retrieving Data from Views:
* **Owner and Object Count:** `(select owner, count(*) obj_cnt from dba_objects group by owner) obj`: Retrieves owner names and counts their associated objects.
* **Owner and Segment Size:** `(select owner, ceil(sum(bytes)/1024/1024) seg_size from dba_segments group by owner) seg`: Calculates total segment space usage in megabytes for each owner.
Joining and Handling Nulls:
* `where obj.owner = seg.owner(+)`: Outer joins the two result sets, ensuring all owners are included even if they have no segments (nulls).
* `decode(seg_size, NULL, 0, seg_size) "size MB"`: Replaces null segment sizes with 0 for owners without segments.
Ordering Results:
* `order by 3 desc, 2 desc, 1`: Prioritizes owners based on:
* Total segment size in descending order (highest usage first).
* Object count in descending order (most objects first).
* Owner name alphabetically.
Key Points:
- Owner-Centric View: Focuses on space usage at the owner level, pinpointing potential storage hogs or areas for optimization.
- Total Segment Size: Shows overall space consumption in megabytes, aiding in capacity planning and identifying potential space constraints.
- Object Counts: Provides context for space usage by indicating the number of objects owned, helping assess data distribution and potential fragmentation.
- Handles Owners Without Segments: Ensures inclusion of all owners, even those with zero space usage.
- Prioritization: Orders results to highlight areas that might require attention for space management.
Insights and Explanations:
Space Management:
- Helps identify owners consuming excessive space, potentially indicating opportunities for optimization or data archiving.
- Guides storage allocation decisions and capacity planning.
Troubleshooting:
- Can be used to investigate space-related issues, such as unexpected growth or storage constraints.
Security Auditing:
- Helps monitor object creation and space usage patterns to detect potential unauthorized activity or data breaches.
Customization:
- Can be modified to filter for specific owners, object types, or storage thresholds based on analysis needs.
Integration: Consider incorporating this code into regular database monitoring and reporting processes for proactive space management.