Solution1: using syscat.tables
using syscat.tables field AVGROWSIZE

SELECT TABNAME, AVGROWSIZE FROM syscat.tables WHERE TABNAME LIKE '%INV%'

Solution2: using CTE
using CTE or you can create stored procedure
with compr as (
select
TABSCHEMA
, TABNAME
, CASE WHEN compression in ('B', 'V') THEN 2 ELSE 0 END as compression_mod
FROM SYSCAT.TABLES
),
col as (
SELECT TABSCHEMA
, TABNAME
, COLNAME
,COALESCE(D.SOURCENAME, C.TYPENAME) AS TYPENAME
,COALESCE(D.LENGTH, C.LENGTH) AS LENGTH
,C.SCALE, C.NULLS, C.INLINE_LENGTH, D.METATYPE
,D.INLINE_LENGTH AS STRUCT_INLINE_LENGTH
, CASE WHEN C.inline_length <> 0
THEN C.inline_length
WHEN metatype = 'R' THEN D.inline_length
WHEN COALESCE(D.SOURCENAME, C.TYPENAME) IN ('CLOB', 'BLOB', 'DBCLOB')
THEN CASE WHEN COALESCE(D.LENGTH, C.LENGTH) <= 1024 THEN 68
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 8192 THEN 92
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 65536 THEN 116
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 524000 THEN 140
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 4190000 THEN 164
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 134000000 THEN 196
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 536000000 THEN 220
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 1070000000 THEN 252
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 1470000000 THEN 276
WHEN COALESCE(D.LENGTH, C.LENGTH) <= 2147483647 THEN 312
ELSE -2 END
WHEN COALESCE(D.SOURCENAME, C.TYPENAME) IN ('LONG VARCHAR', 'LONG VARGRAPHIC')
THEN 20
WHEN COALESCE(D.SOURCENAME, C.TYPENAME) = 'XML' THEN 80
ELSE 0 END as LOBLENGTH
FROM SYSCAT.COLUMNS AS C
LEFT OUTER JOIN SYSCAT.DATATYPES AS D
ON D.typeschema = C.typeschema
AND D.typename = C.typename
AND D.typemodulename IS NULL
AND C.typeschema <> 'SYSIBM '
),
tot as (select
col.TABSCHEMA as tabschema
, col.TABNAME as tabname
,SUM(CASE TYPENAME
WHEN 'SMALLINT' THEN length + compression_mod
WHEN 'INTEGER' THEN length + compression_mod
WHEN 'BIGINT' THEN length + compression_mod
WHEN 'REAL' THEN length + compression_mod
WHEN 'DOUBLE' THEN length + compression_mod
WHEN 'DECFLOAT' THEN length + compression_mod
WHEN 'DECIMAL' THEN TRUNC(length / 2) + 1 + compression_mod
WHEN 'CHARACTER' THEN length + compression_mod
WHEN 'VARCHAR' THEN length + 4 - compression_mod
WHEN 'GRAPHIC' THEN length * 2 + compression_mod
WHEN 'VARGRAPHIC' THEN length * 2 + 4 - compression_mod
WHEN 'LONG VARCHAR' THEN 24 - compression_mod
WHEN 'LONG VARGRAPHIC' THEN 24 - compression_mod
WHEN 'CLOB' THEN loblength + 4 - compression_mod
WHEN 'BLOB' THEN loblength + 4 - compression_mod
WHEN 'DBCLOB' THEN loblength + 4 - compression_mod
WHEN 'XML' THEN loblength + 3 - compression_mod
WHEN 'DATE' THEN length + compression_mod
WHEN 'TIME' THEN length + compression_mod
WHEN 'TIMESTAMP' THEN length + compression_mod
ELSE CASE WHEN metatype = 'R' THEN loblength + 4 - compression_mod
ELSE -3 END
END
+ CASE WHEN compression_mod = 0 AND NULLS = 'Y' THEN 1 ELSE 0 END) as row_size
FROM compr join col on compr.tabname=col.tabname
and compr.tabschema=col.tabschema
GROUP BY col.tabschema, col.tabname)
select
substr(tot.tabschema,1,24) as tabschema
, substr(tot.tabname,1,40) as tabname
-- comment the above two rows and uncomment the below two rows for full, non-truncated table names
-- tot.tabschema
-- , tot.tabname
, row_size + CASE WHEN compr.compression_mod <> 0 THEN 2 ELSE 0 END AS SIZE_IN_BYTE
-- uncomment the following two rows if you have created the stored procedure and want to compare results
-- , GetRowSize(tot.tabschema, tot.tabname) as sp_row_size
-- , GetRowSize(tot.tabschema, tot.tabname) - row_size + CASE WHEN compr.compression_mod <> 0 THEN 2 ELSE 0 END as diff
FROM tot join compr on tot.tabschema=compr.tabschema and tot.tabname=compr.tabname
--WHERE tot.tabname LIKE '%INV%'
;
Reference
- How to calculate Row size of table in db2 - Stack Overflow
- DB2 Table Row (Tuple) Size (virtual-dba.com)
- Legacy Communities - IBM TechXchange Community by Serge Rileau. (Very Old doc for CTE and Store Procedure)
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.



