-- STORAGE - Logical & Physical
-- 1. Database
-------------- Database --> Tablespace
-- Tablespace :
-- Within a database the tablespace is the largest logical storage structure
-- Every database must consist of one or more tablespaces.
-- Every tablespace must belong to one and only one database.
-- Tablespace size = sum of data files size
-------------- Database --> Datafiles
-- Every Database must consist of one or more datafiles.
-- Each datafile must belong to one and only one Database.
-- 2. Tablespace
------------------------------------------
--------------- Tablespace --> Segments
-- Segment :
-- Within a tablespace, space is allocated to segments. A segment is an object in the
-- database that requires storage, such as a table or an index. A view, on the other hand,
-- is not a segment, since it does not store data; it is just a prewritten query that allows
-- easy access to data stored in tables.
-- Every tablespace may contain one or more segments.
-- Every segment must exist in one and only one tablespace.
---------------- Tablespace --> Datafiles
-- Every tablespace must consist of one or more datafiles.
-- Each datafile must belong to one and only one tablespace.
-- 3. Segments
----------------------------------------
---------------- Segment --> Extents
-- Extent :
-- When space is allocated for segments in a tablespace, it is allocated in extent units.
-- Every segment must consist of one or more extents.
-- Each extent must belong to one and only one segment.
---------------- Segments >--> Datafiles
-- Every datafile consists of one or more segments
-- Each segmets can belong to one or more datafiles
-- 4. Extents
--------------
------------- Extents --> Oracle blocks (Default 8k)
-- Oracle block :
-- Oracle block is the smallest logical storage unit
-- for every Oracle I/O request at least one Oracle block is being read
-- Every extent must consist of one or more Oracle blocks.
-- Each Oracle block may belong to one and only one extent.
------------- Extents >-- Datafiles
-- Every extent must be located in one and only one datafile.
-- The space in the datafile may be allocated as one or more extents.
-- Delete operations (with / without commit) won't change table High Water Mark (HWM)
-- 5. Oracle blocks
-------------------
------------------ Oracle block --> OS blocks
-- Every Oracle block must consist of one or more operating system blocks.
-- Every operating system block may be part of one and only one Oracle block.
-- It is a good idea to keep the operating system block size the same as the Oracle block size
-- This way, for every Oracle I/O request the operating system needs to retrieve only one block.
------------------ Datafiles --> OS Blocks
-- OS Block :
-- Operating system blocks are the minimum allocation unit for the file system.
-- Each file system has its own minimum and default size
-- Every datafile must consist of one or more operating system blocks.
-- Each operating system block may belong to one and only one datafile.
-------------------------------- Schemas
-- There is no relationship between a tablespace and a schema.
-- Objects in the same schema can be in different tablespaces,
-- and a tablespace can hold objects from different schemas.
---------------------------------------------------------------------------------------------
-- Tablespace Types
---------------------------------------------------------------------------------------------
----------------------- The SYSTEM tablespace
---------------------------------------------
-- * The SYSTEM tablespace contains the data dictionary-internal tables that describe
-- the structure of the database itself, all of the objects in it, users, roles, and privileges.
-- * The SYSTEM tablespace also contains the SYSTEM undo or rollback segment (also called SYSTEM),
-- which can be used only for operations on objects stored in the SYSTEM tablespace.
-- * Oracle Database creates The SYSTEM tablespace automatically when the database is created
-- * User objects should be kept out of the SYSTEM tablespace in order to keep it
-- operating efficiently.
-- * Cannot be taken offline
----------------------- The SYSAUX tablespace (10g)
---------------------------------------------------
-- * The SYSAUX tablespace is also considered a SYSTEM tablespace and is used to
-- store statistical and other Oracle tools information (AWR, OEM and many more)
-- * the SYSAUX tablespace is always created during database creation or database upgrade
----------------------- The Temporary tablespaces (9i)
------------------------------------------------------
-- * Temporary tablespaces are used mainly to manage space for database sort operations
-- (Server Process will try to sort data in the PGA by default, if its not possible it
-- will sort it in the Temporary tablespaces)
-- * When the SYSTEM tablespace is locally managed, you must define at least one default temporary
-- tablespace when creating a database.
-- * A locally managed SYSTEM tablespace cannot be used for default temporary storage.
-- * If SYSTEM is dictionary managed and if you do not define a default temporary tablespace when
-- creating the database, then SYSTEM is still used for default temporary storage. However, you
-- will receive a warning in ALERT.LOG saying that a default temporary
-- tablespace is recommended and will be necessary in future releases.
-- * Cannot be taken offline
----------------------- The UNDO tablespaces
--------------------------------------------
-- * Holds information that is used to roll back, or undo, changes to the database
-- * A database can contain more than one undo tablespace, but only one can be in use at any time.
-- * Cannot be taken Offline
----------------------- User Defined tablespaces
------------------------------------------------
-- * User Defined tablespaces
--------------------------------------------------------------------------------
-- Viewing logical & physical storage using System Tables
--------------------------------------------------------------------------------
-----------------------
-- Redo Log Files:
SELECT * FROM v$log;
SELECT * FROM v$logfile;
-- Manual log switch:
-- ALTER SYSTEM SWITCH LOGFILE;
-----------------------
-- Tablespaces and Data files
DESC DBA_TABLESPACES
-- Information about all tablespaces in the DB:
SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE
FROM DBA_TABLESPACES;
------------------------
-- Information about all data files in the DB:
DESC DBA_DATA_FILES
col file_name for a50
SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 File_Size_MB
FROM DBA_DATA_FILES;
------------------------
-- Tablespace Size
-- Allocated Size:
SELECT TABLESPACE_NAME, SUM(bytes)/1024/1024 size_mb, COUNT(*) files
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME;
-- Free Space:
SELECT TABLESPACE_NAME, SUM(bytes)/1024/1024 size_mb
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME;
-- Via OEM:
-- Server => (Storage) => Tablespaces / Datafiles
--------------------------------------------------------------------------------
-- In which Tablespace a new table will be created ?
--------------------------------------------------------------------------------
-- Explicitly specifing the Tablespace
CREATE TABLE newtab (id NUMBER) TABLESPACE users;
-- If the Tablespace not explicitly specified, new table will be created in user
-- Defalt Tablespace
SELECT username, DEFAULT_TABLESPACE
FROM dba_users;
-- If there is no User Defalt Tablespace, it will be created in the
-- Database Defalt Tablespace (10g)
SELECT * FROM database_properties
WHERE PROPERTY_NAME LIKE '%TABLESPACE%'
ALTER DATABASE DEFAULT TABLESPACE example;
-- If there is no Database Defalt Tablespace, the table will be created in the System Tablespace
--------------------------------------------------------------------------------
-- Creating a new Tablespace
--------------------------------------------------------------------------------
CREATE TABLESPACE MY_TBS
DATAFILE 'c:\my_tbs_file1.dbf' SIZE 10M ,
'c:\my_tbs_file2.dbf' SIZE 10M
DROP TABLESPACE MY_TBS ;
DROP TABLESPACE MY_TBS INCLUDING CONTENTS AND DATAFILES ;
CREATE BIGFILE TABLESPACE BIGFILE_TBS
DATAFILE 'C:\BIGFILE.DBF'SIZE 100M ;
DROP TABLESPACE BIGFILE_TBS INCLUDING CONTENTS AND DATAFILES ;
-- Bigfile vs Smallfile
------------------------
-- * A bigfile tablespace contains only one datafile or tempfile, which can contain up to
-- approximately 4 billion (232) blocks. The maximum size of the single datafile or tempfile is
-- 32TB (for a tablespace with 8K blocks).
-- * A smallfile tablespace is a traditional Oracle tablespace, which can contain 1022 datafiles or
-- tempfiles, each of which can contain up to approximately 4 million (222) blocks.
-- (32 GB for 8k block)
--------------------------------------------------------------------------------
-- EXTENT MANAGEMENT (Of segments in a Tablespace)
--------------------------------------------------------------------------------
-- Locally managed VS Dictionary-managed
-- Dictionary managed
---------------------
-- * Dictionary-managed tablespaces are the historical way of managing extents
-- requires any allocation or deallocation of an extent to update a table in the data
-- dictionary.
-- * This means that any time an extent is allocated to a table, the data dictionary
-- must be touched to record the change. When a table is dropped or truncated, the
-- data dictionary must be changed. Because of the amount of work required on the data
-- dictionary when using dictionary-managed extents, they are no longer recommended
-- and exist primarily for backward compatibility.
-- * All tablespaces should be created withlocal extent management
CREATE TABLESPACE dict_tbs
DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\dicttbs.dbf' SIZE 10m
EXTENT MANAGEMENT DICTIONARY
CREATE TABLE am05 (col1 number)
STORAGE (initial 100mb next 10mb pctincrease 50);
/*
-- Dictionary managed Extent allocation
INITIAL - size of the first extent (100)
NEXT - size for the next extent (10)
PCTINCREASE - (15)
-- If System TBS is Locally managed, It's not possible to create DM TBS
*/
-- Locally managed
-----------------------
-- * Locally managed extents are more efficient and are recommended for all database data
-- * In a tablespace where extents are locally managed, free extents are stored in a bitmap in
-- the tablespace
-- * As an extent is allocated to a segment or freed up because a segment was
-- dropped, truncated, or resized, the bitmap is updated to reflect the change
CREATE TABLESPACE auto_tbs
DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\auto_tbs.dbf' SIZE 25M
EXTENT MANAGEMENT LOCAL
--------------------------------------------------------------------------------
-- Locally managed - Extent allocation: AUTOALLOCATE vs. UNIFORM
--------------------------------------------------------------------------------
-- AUTOALLOCATE, allocation method
-- First 16 extents --> 64kb
-- Next 63 extents --> 1MB
-- Next 120 extents --> 8MB
-- Ramaining extents --> 64MB
-- DROP TABLESPACE auto_tbs INCLUDING CONTENTS AND DATAFILES ;
CREATE TABLESPACE auto_tbs
DATAFILE 'C:\auto_tbs.dbf' SIZE 25M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE
FROM DBA_TABLESPACES;
col FILE_NAME for a40
COL TABLESPACE_NAME for a15
SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 File_Size_MB
FROM DBA_DATA_FILES;
-- Create a table in the tablespace:
CREATE TABLE auto_tab (a VARCHAR2(3000))
TABLESPACE auto_tbs;
SELECT TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE TABLESPACE_NAME = 'AUTO_TBS';
-- See how much space is allocated to the table:
col SEGMENT_NAME for a30
SELECT SEGMENT_NAME, BYTES/1024, EXTENTS
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'AUTO_TAB';
-- See how many extents:
DESC DBA_EXTENTS
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'AUTO_TAB';
-- Fill up the table with data:
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO AUTO_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
-- Check segment size and extents again...
-- How to drop Tablespace
-------------------------
DROP TABLESPACE auto_tbs
DROP TABLESPACE auto_tbs INCLUDING CONTENTS
-- but what about the datafiles ?
-- Creating the tablespace again with the [REUSE] option
CREATE TABLESPACE auto_tbs
DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\auto_tbs.dbf' SIZE 25M
REUSE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
-- 1 [DROP TABLESPACE] and remove data files manually
-- 2 DROP TABLESPACE auto_tbs INCLUDING CONTENTS AND DATAFILES
-- CREATE TABLE [STORAGE]
-------------------------
CREATE TABLE mytab2 (id number)
STORAGE (INITIAL 100m);
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'MYTAB2';
DROP TABLE MYTAB2
Advantages
----------
-- 1. reduce I/O when the table is being scanned
-- 2. Improve performance when Oracle allocates the extents
--------------------------------------------------------------------------------
-- Local - UNIFORM SIZE
--------------------------------------------------------------------------------
DROP TABLESPACE uniform_tbs INCLUDING CONTENTS AND DATAFILES ;
CREATE TABLESPACE uniform_tbs
DATAFILE 'C:\uni_tbs.dbf' SIZE 25M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M;
SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE, NEXT_EXTENT / 1024
FROM DBA_TABLESPACES;
-- Create a new table in it:
CREATE TABLE uniform_tab (a VARCHAR2(3000))
TABLESPACE uniform_tbs;
-- See how much space is allocated to the table:
SELECT SEGMENT_NAME, BYTES/1024, EXTENTS
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'UNIFORM_TAB';
-- See how many extents:
col segment_name for a15
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'UNIFORM_TAB';
-- Fill up the table with data:
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
-- See how many extents:
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'UNIFORM_TAB';
-- Other tablespaces:
SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE
FROM DBA_TABLESPACES;
-- Check free space:
SELECT TABLESPACE_NAME, BYTES/1024/1024
FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME = 'UNIFORM_TBS';
----------------------------------------------------------------
-- RESIZE TABLESPACE:
----------------------------------------------------------------
-- Fill up:
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
/
[ORA-01653: unable to extend table SYS.UNIFORM_TAB by 256 in tablespace]
------------------------------
-- 1. Add a new file:
------------------------------
-- Add a new file:
ALTER TABLESPACE UNIFORM_TBS
ADD DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNIFORM_TBS02.DBF' size 25m;
ALTER TABLESPACE UNIFORM_TBS
DROP DATAFILE 'C:\UNIFORM_TBS02.DBF' ;
-- Fill up:
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
SELECT FILE_NAME, BYTES/1024/1024 File_Size, MAXBYTES/1024/1024 Max_Size,
AUTOEXTENSIBLE, INCREMENT_BY*8/1024 Growth
FROM dba_data_files
WHERE TABLESPACE_NAME = 'UNIFORM_TBS';
-- Fill up again:
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
------------------------------------
-- 2. Increase an existing datafile:
------------------------------------
---------------------------------
-- 2.1 - Manual Resize - RESIZE
---------------------------------
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNIFORM_TBS02.DBF' RESIZE 50M;
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNIFORM_TBS02.DBF' RESIZE 30M;
SELECT FILE_NAME, BYTES/1024/1024 File_Size, MAXBYTES/1024/1024 Max_Size,
AUTOEXTENSIBLE, INCREMENT_BY*8/1024 Growth
FROM dba_data_files
WHERE TABLESPACE_NAME = 'UNIFORM_TBS';
SELECT TABLESPACE_NAME, SUM(bytes)/1024/1024 size_mb, COUNT(*) files
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME;
BEGIN
FOR i IN 1..5000 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
/
------------------------------------
-- 2.2 Automatic resize - AUTOEXTEND
------------------------------------
ALTER DATABASE
DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNIFORM_TBS02.DBF'
AUTOEXTEND ON NEXT 10m MAXSIZE 150m;
----
DROP TABLESPACE uniform_tbs INCLUDING CONTENTS AND DATAFILES ;
CREATE TABLESPACE uniform_tbs
DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\uni_tbs.dbf' SIZE 25M
AUTOEXTEND ON NEXT 10M ;
CREATE TABLE uniform_tab (a VARCHAR2(3000))
TABLESPACE uniform_tbs;
SELECT SEGMENT_NAME, BYTES/1024, EXTENTS
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'UNIFORM_TAB';
col segment_name for a15
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'UNIFORM_TAB';
BEGIN
FOR i IN 1..7500 LOOP
INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*'));
END LOOP;
END;
/
SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS
FROM DBA_EXTENTS
WHERE segment_name = 'UNIFORM_TAB';
col FILE_NAME for a40
COL TABLESPACE_NAME for a15
SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 File_Size_MB
FROM DBA_DATA_FILES;
----------------------------------------
-- ONLINE/OFFLINE READ ONLY/READ WRITE
----------------------------------------
SELECT tablespace_name, status
FROM dba_tablespaces;
-- ONLINE/OFFLINE
-----------------
-- You may want to take a tablespace offline for any of the following reasons:
-- To make a portion of the database unavailable while allowing
-- normal access to the remainder of the database
-- To perform an offline tablespace backup
-- (even though a tablespace can be backed up while online and in use)
-- To rename or relocate tablespace datafiles
-- When a tablespace is taken offline, the database takes all the associated files offline.
-- * You cannot take the following tablespaces offline:
-- SYSTEM
-- The undo tablespace
-- Temporary tablespaces
ALTER TABLESPACE example OFFLINE;
ALTER TABLESPACE example ONLINE;
-- READ ONLY/READ WRITE
-----------------------
ALTER TABLESPACE example READ ONLY;
SELECT last_name from hr.employees WHERE employee_id = 100;
UPDATE hr.employees SET salary=salary;
ALTER TABLESPACE example READ WRITE ;
--------------------------------------------------------------------------------
-- OMF Oracle-Managed Files
--------------------------------------------------------------------------------
-- Oracle-Managed Files
-----------------------
-- Using Oracle-managed files simplifies the administration of an Oracle Database.
-- Oracle-managed files eliminate the need for you, the DBA, to directly manage the operating system -- files comprising an Oracle Database.
-- You specify operations in terms of database objects rather than filenames.
-- The database internally uses standard file system interfaces
-- to create and delete files as needed.
-- Enabling the Creation and Use of Oracle-Managed Files
--------------------------------------------------------
-- DB_CREATE_FILE_DEST
-- This initialization parameter allow Oracle use the Oracle-managed files for Datafiles
-- and Temporary files
show parameter db_create_file
ALTER SYSTEM SET db_create_file_dest = 'E:\app\Owner\oradata\orcl';
CREATE TABLESPACE tbs_3 ;
-- By default, OMF Files are 100MB, Autoextentsible (unlimited)
DROP TABLESPACE tbs_3 ;
CREATE TABLESPACE tbs_3 DATAFILE SIZE 40M;
DROP TABLESPACE tbs_3 ;
CREATE TABLESPACE tbs_3 DATAFILE SIZE 40M, SIZE 20M ;
DROP TABLESPACE tbs_3 ;
CREATE TABLESPACE tbs_3 DATAFILE SIZE 40M, SIZE 20M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
ALTER TABLESPACE tbs_3 ADD DATAFILE;
DROP TABLESPACE tbs_3 ;
-- Is it still possible to use Non-OMF?
CREATE TABLESPACE mytbs
DATAFILE 'C:\oracle\mytbs.dbf' SIZE 10m
-- Advantages:
--------------
-- DBAs don't need to specify file names, locations and sizes when creating a tablespace or database
-- Automatic removal of files when a tablespace or log file is dropped
-- Simplified creation of test and development systems
-- Disadvantages:
-----------------
-- Can only be used with file systems, not with RAW Volumes
-- Generated file names and locations might not be according to the site's naming standards
-- Limited scope for file placement and I/O tuning may impact performance
-- (although locations can be altered dynamically)