- IN_LINE - for column with a fixed length or columns with a variable length whose declared column length is <= 128 bytes (by default). This method is used by getting the best performance.
- OUT_OF_LINE - for columns whose declared column length is > 128 bytes (by default). Out-of-line columns are not stored contiguously with the row but are allocated. Accessing out-of-line columns is slightly slower than accessing in-line columns. LOB data types are stored out-of-line.
Command> create table t (in_line varchar2 (50),
> out_of_line varchar2(129));
Command> desc t;
Table GENA.T:
Columns:
IN_LINE VARCHAR2 (50) INLINE
OUT_OF_LINE VARCHAR2 (129) NOT INLINE
1 table found.
(primary key columns are indicated with *)
As you can see, the IN_LINE column stores date by using INLINE and the OUT_OF_LINE column stores date by using NOT INLINE. You can also implicitly specify the store method:
Command> create table t2 (in_line varchar2 (50),
> out_of_line varchar2(129) inline);
Command> desc t2;
Table GENA.T2:
Columns:
IN_LINE VARCHAR2 (50) INLINE
OUT_OF_LINE VARCHAR2 (129) INLINE
1 table found.
(primary key columns are indicated with *)
Command>
Now, let’s create a simple table:
Command> create table emp (id number not null,
> creation date,
> name_1 varchar2(40),
> name_2 varchar2(40),
> surname varchar2(40),
> dept_id number);
Command> desc emp;
Table GENA.EMP:
Columns:
ID NUMBER NOT NULL
CREATION DATE
NAME_1 VARCHAR2 (40) INLINE
NAME_2 VARCHAR2 (40) INLINE
SURNAME VARCHAR2 (40) INLINE
DEPT_ID NUMBER
1 table found.
(primary key columns are indicated with *)
What size does it have? We can use a new TimesTen feature for that. If you want to know what size your table has you should compute it by using ttComputeTabSizes('table_name') function and after that you will be able to see the table size in SYS.ALL_TAB_SIZES table or using tablesize table_name command:
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 0
NUM_USED_ROWS: 0
NUM_FREE_ROWS: 0
AVG_ROW_LEN: Not computed
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 784
LAST_UPDATED: 2012-01-19 19:37:07.000000
1 table found.
Command>
As you can see, there are no any data in EMP table. We see the metadata size (784 bytes) only, but we can get more information from data dictionary:
Command> VARIABLE TABNAME VARCHAR2(50) := 'EMP';
Command> SET AUTOVARIABLES ON;
Command> select COLNAME,
> COLLEN,
> INLINELEN
> from SYS.COLUMNS
> where id = ( select TBLID
> from sys.tables
> where tblname = :TABNAME);
< CREATION , 7, 7 >
< DEPT_ID , 22, 22 >
< ID , 22, 22 >
< NAME_1 , 40, 44 >
< NAME_2 , 40, 44 >
< SURNAME , 40, 44 >
6 rows found.
Command> select sum(COLLEN) SUM_COL_LEN,
> sum(INLINELEN) SUM_INLINE_LEN
> from SYS.COLUMNS
> where id = ( select TBLID
> from sys.tables
> where tblname = :TABNAME);
< 171, 183 >
1 row found.
Command> select tblname, LENGTH from sys.tables where tblname = :TABNAME;
< EMP , 192 >
1 row found.
Command>
The data dictionary contains information about the EMP table. The SYS.COLUMN table contains columns information including data types, length of the column (SYS.COLUMN.COLLEN) and how many bytes a given column contributes to the inline width of a row (SYS.COLUMN.INLINELEN). Additionally, the SYS.TABLES table contains the length of inline portion of each row (SYS.TABLES.LENGTH). Now, let’s insert a row into the table:
Command> insert into emp values (1,sysdate,'gena', 'gena', 'gena', 1);
1 row inserted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 52080
NUM_USED_ROWS: 1
NUM_FREE_ROWS: 255
AVG_ROW_LEN: 206
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 52864
LAST_UPDATED: 2012-01-19 19:37:54.000000
1 table found.
Command>
Let's analyze what we've got. First of all, the INLINE page was allocated for storing 256 rows and you've got information about already stored rows and about free rows (NUM_USED_ROWS = 1 and NUM_FREE_ROWS = 255). In this example all data are storing inside INLINE page that is why OUT_OF_LINE_BYTES = 0. Additionally we see the average row length (AVG_ROW_LEN = 206) and the total table size (TOTAL_BYTES = 52864).
Let's insert 255 rows into EMP table.
Command> begin
> for i in 2 .. 256 loop
> insert into emp
> values (i,
> sysdate,
> '1234567890123456789012345678901234567890',
> '1234567890123456789012345678901234567890',
> '1234567890123456789012345678901234567890',
> i);
> end loop;
> end;
> /
PL/SQL procedure successfully completed.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 52080
NUM_USED_ROWS: 256
NUM_FREE_ROWS: 0
AVG_ROW_LEN: 206
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 52864
LAST_UPDATED: 2012-01-24 15:49:40.000000
1 table found.
Command>
Nothing changes except NUM_USED_ROWS and NUM_FREE_ROWS parameters. Let's insert one more row.
Command> insert into emp values (257,sysdate,'gena', 'gena', 'gena', 1);
1 row inserted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 104160
NUM_USED_ROWS: 257
NUM_FREE_ROWS: 255
AVG_ROW_LEN: 204
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 104944
LAST_UPDATED: 2012-01-24 15:50:29.000000
1 table found.
Command>
One more INLINE page was allocated for storing next 256 rows. Size the same (52080*2=104160). Metadata have the same size (784). But average row size was decrease till 204 bytes. What will happen if I delete the last row?
Command> delete from emp where id=257;
1 row deleted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 52080
NUM_USED_ROWS: 256
NUM_FREE_ROWS: 0
AVG_ROW_LEN: 206
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 52864
LAST_UPDATED: 2012-01-24 18:00:57.000000
1 table found.
Command>
I deleted the single row in the new block that is why the block was deallocated. What If i deleted a row from first block?
Command> insert into emp values (257,sysdate,'gena', 'gena', 'gena', 1);
1 row inserted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 104160
NUM_USED_ROWS: 257
NUM_FREE_ROWS: 255
AVG_ROW_LEN: 204
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 104944
LAST_UPDATED: 2012-01-24 18:07:47.000000
1 table found.
Command> delete from emp where id=1;
1 row deleted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 104160
NUM_USED_ROWS: 256
NUM_FREE_ROWS: 256
AVG_ROW_LEN: 204
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 104944
LAST_UPDATED: 2012-01-24 18:08:02.000000
1 table found.
Command>
The INLINE_ALLOC_BYTES value didn't change (104160) because I deleted the row from first block. Let's delete more rows from first block.
Command> delete from emp where id between 3 and 256;
254 rows deleted.
Command> call ttComputeTabSizes('emp');
Command> tablesize emp;
Sizes of GENA.EMP:
INLINE_ALLOC_BYTES: 104160
NUM_USED_ROWS: 2
NUM_FREE_ROWS: 510
AVG_ROW_LEN: 204
OUT_OF_LINE_BYTES: 0
METADATA_BYTES: 784
TOTAL_BYTES: 104944
LAST_UPDATED: 2012-01-24 18:17:42.000000
1 table found.
Command>
TimesTen allocated two pages (104160 bytes) for storing only two rows. Of course the next inserted rows will be inserted into free space in the first block for avoiding fragmentation but you should know about it.
Conclusion
A lot of new features were introduced in new TimesTen version. One of them it is possibility to know the actual table size and this functionality is very easy for use I think.