HCM90: More Tablespace Sizing

There is a fix out to reduce the database size:

  • Financials: 704935
  • HRMS: 704332
  • Portal: 704763

The only difference between the changes in the fix and what I had previously done,  is the blocksize setting.  As far as I could tell, it really didn’t make a sizeable impact.  What did make a difference was changing the properties on the other tablespaces besides the index tablespace.

Below I have listed some SQL and such that I used to shrink the database and move segments from the tablespaces.

Starting Sizes:

  • SP_EMPTY_INDEX.DBF = 1.57G
  • PSINDEX.DBF = 1.46G
  • PSIMAGE.DBF = 1.26G

New Sizes:

  • PSINDEXNEW.DBF = 1.50G (with all indexes from empty index tablespace)
  • PSINDEXNEW.DBF = 2.97G (including indexes from PSINDEX)
  • PSIMAGE.DBF = 750M

Original SQL to create the tablespace:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create tablespace sp_empty_index
 
datafile ‘e:\oradata\HCM90\SP_EMPTY_INDEX.DBF’
 
size 10m
 
blocksize 2k
 
extent management local autoallocate
 
segment space management auto;
 
ALTER DATABASE DATAFILE ‘e:\oradata\HCM90\SP_EMPTY_INDEX.DBF’
 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;

New Tablespace Creation:The only difference here was the blocksize SQL.

1
2
3
4
5
6
7
8
9
10
11
12
13
create tablespace PSINDEXNEW
 
datafile 'e:\oradata\HCM90\PSINDEXNEW.DBF'
 
size 10m
 
extent management local autoallocate
 
segment space management auto;
 
ALTER DATABASE DATAFILE 'e:\oradata\HCM90\PSINDEXNEW.DBF'
 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;

What Indexes are in the tablespace?

1
2
3
select * from dba_segments
 
where tablespace_name = 'SP_EMPTY_INDEX';

Moving the Indexes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
declare
 
begin
 
   for index_rec in (select owner, segment_name
 
                     from dba_segments
 
                     where segment_type = 'INDEX'
 
                     and tablespace_name = 'SP_EMPTY_INDEX')
 
   loop
 
      execute immediate 'alter index ' || index_rec.owner || '.' ||
 
          index_rec.segment_name || ' rebuild tablespace PSINDEXNEW';
 
   end loop;
 
end;

Dropping the Tablespace

1
drop tablespace SP_EMPTY_INDEX including contents;

Then, I had to stop the database and restart it to get it to release the lock on the datafile. Once I did this, I could delete the datafile from the system.PSINDEX tablespace

I did the same thing to the PSINDEX. Moved all of the indexes out of it into the new PSINDEXNEW tablespace. At this point, I could remove that tablespace as well.

Renaming Tablespaces:

Next, I wanted to keep the same tablespace name, and so, I renamed the tablespace back to the original. From what I understand, this requires Oracle 10g.

1
alter tablespace PSINDEXNEW rename to PSINDEX;

To rename the datafile as well, you must do this:1. Take the tablespace offline

1
alter tablespace PSINDEX offline;

2. Rename the data file in the operating system3. Rename the data file in the database

1
alter tablespace PSINDEX rename datafile 'E:\ORADATA\HCM90\PSINDEXNEW.DBF' to 'E:\ORADATA\HCM90\PSINDEX.DBF';

4 bring the tablespace back online

1
alter tablespace PSINDEX online;

Moving Tables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
declare
 
begin
 
   for index_rec in (select owner, segment_name
 
                     from dba_segments
 
                     where segment_type = 'TABLE'
 
                     and tablespace_name = 'PSIMAGE')
 
   loop
 
      execute immediate 'alter table ' || index_rec.owner || '.' ||
 
          index_rec.segment_name || ' move tablespace PSIMAGENEW';
 
   end loop;
 
end;

Moving LOBsThe PSIMAGE tablespace has two segment types: LOBINDEX and LOBSEGMENT that can be taken care of with this SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
declare
 
begin
 
   for index_rec in (select owner, table_name, column_name
 
                     from dba_lobs
 
                     where tablespace_name = 'PSIMAGE')
 
   loop
 
      execute immediate 'alter table ' || index_rec.owner || '.' ||
 
          index_rec.table_name || ' move lob(' || index_rec.column_name ||
 
          ') store as (tablespace PSIMAGENEW)';
 
   end loop;
 
end;

Resources:

2 thoughts on “HCM90: More Tablespace Sizing

  1. I do something similar to reclaim space in our development environments, but just with indexes inplace and online. We have about 14GB worth of free space (select sum(bytes)/1024/1024 from dba_free_space), and I am able to reclaim half of it after a refresh. I’ll have try rebuilding the tables and LOBs and see if it’s worth the downtime.

Leave a Comment

Your email address will not be published. Required fields are marked *

Comments
Name
Email
Website

This site uses Akismet to reduce spam. Learn how your comment data is processed.