/
The number of rows in a table using table statistics

The number of rows in a table using table statistics

Database

SQL

Commands for refresh statistics

Database

SQL

Commands for refresh statistics

Oracle

select num_rows from dba_tables where owner = 'DEMO01' and table_name = 'TAB05_PART';

View name: dba_tables or all_tables

Compute for a table:

begin
dbms_stats.gather_table_stats(ownname => 'DEMO01' , tabname => 'TAB05_PART', degree => 4);
end;

Compute for a schema:

begin
dbms_stats.gather_schema_stats(ownname => 'SAMPLE1', degree => 2);
end;

Microsoft SQL

SELECT row_count FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('test.tab_statistic');

OR with database name

SELECT row_count FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Acc_lhost_MSSQL2_lhost_SQLEXPRESS.test.tab_statistic');

Compute for a table:

UPDATE STATISTICS test.tab_statistic WITH FULLSCAN;

Compute for all tables in the current database:

EXEC sp_updatestats;

MySQL

select table_rows from INFORMATION_SCHEMA.TABLES
where table_schema='MASKING_TEST' and table_name='test_stat';

Compute for a table:

analyze table MASKING_TEST.test_stat;

Analyzing multiple tables:

analyze table MASKING_TEST.T1, TABLE_50K;

PostgreSQL

SELECT reltuples::bigint AS estimate
FROM pg_class
WHERE oid = 'test."TEST_STAT"'::regclass;

Compute for a table:

analyze MASKING_TEST.test_stat;

Compute for all tables in the current database:

analyze [verbose];

DB2 LUW

SELECT CARD FROM syscat.tables
WHERE tabschema='TEST' AND tabname='TEST_STAT';

Compute for a table:

CALL SYSPROC.ADMIN_CMD ('RUNSTATS ON TABLE TEST.TEST_STAT');

SAP HANA Database

SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03'

Looks like HANA database refreshing row count statistic automatically. Checked this after INSERT, DELETE, TRUNCATE, CREATE TABLE AS SELECT, IMPORT operations.

DB2 z/os

SELECT CARDF
FROM SYSIBM.SYSTABLES
WHERE CREATOR = 'TEST1' AND NAME = 'TAB06';

Compute for a table:

CALL SYSPROC.DSNUTILU('RUNSTAT','NO','TEMPLATE TEMPL1 DSN IBMUSER.SYSUT1 UNIT SYSDA TEMPLATE TEMPL2 DSN IBMUSER.SORTOUT UNIT SYSDA TEMPLATE TEMPL3 DSN IBMUSER.SYSERR3 UNIT SYSDA RUNSTATS TABLESPACE(DSN03248.TAB06) TABLE(ALL) TABLESAMPLE SYSTEM AUTO UPDATE ALL ',1);

 

where DSN03248.TAB06 =

SELECT DBNAME||'.'||TSNAME
FROM SYSIBM.SYSTABLES
WHERE CREATOR = 'TEST1' AND NAME = 'TAB06';

 

Examples of the behavior of the relevance of statistics in different databases:

Oracle database

drop table sample1.tab1 purge; create table sample1.tab1(id number); insert into sample1.tab1 values(1); commit; select num_rows from dba_tables where owner = 'SAMPLE1' and table_name = 'TAB1'; --Result: NULL !!! begin dbms_stats.gather_schema_stats(ownname => 'SAMPLE1', degree => 2); end; / select num_rows from dba_tables where owner = 'SAMPLE1' and table_name = 'TAB1'; -- 1

Microsoft SQL

USE Acc_lhost_MSSQL2_lhost_SQLEXPRESS; drop table test.tab_statistic; CREATE TABLE test.tab_statistic ( ID int NULL ); SELECT row_count FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('test.tab_statistic'); -- Result : 0 insert into test.tab_statistic values(1); SELECT row_count FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('test.tab_statistic'); -- Result: 1 --Or with database name SELECT row_count FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('Acc_lhost_MSSQL2_lhost_SQLEXPRESS.test.tab_statistic'); -- Result: 1 truncate table test.tab_statistic; SELECT row_count FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('test.tab_statistic'); -- Result: 0 -- Insert 5000 rows: DECLARE @cnt INT = 0 BEGIN TRAN WHILE @cnt < 5000 BEGIN insert into test.tab_statistic values(@cnt) SET @cnt = @cnt + 1 END COMMIT TRAN GO SELECT row_count FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('test.tab_statistic'); --Result: 5000 UPDATE STATISTICS test.tab_statistic WITH FULLSCAN; use Acc_lhost_MSSQL2_lhost_SQLEXPRESS; EXEC sp_updatestats;

MySQL

drop table MASKING_TEST.test_stat; create table MASKING_TEST.test_stat ( ID INT NULL ); select table_rows from INFORMATION_SCHEMA.TABLES where table_schema='MASKING_TEST' and table_name='test_stat'; ## Result: 0 insert into MASKING_TEST.test_stat values (1); select table_rows from INFORMATION_SCHEMA.TABLES where table_schema='MASKING_TEST' and table_name='test_stat'; # Result: 1 drop procedure insrt_test_stat; # Insert 1000 rows DROP PROCEDURE IF EXISTS insert_test_stat; DELIMITER // CREATE PROCEDURE insert_test_stat() BEGIN DECLARE i INT DEFAULT 1; START TRANSACTION; WHILE (i <= 1000) DO insert into test_stat values(i); SET i = i+1; END WHILE; COMMIT; END; // DELIMITER ; call insert_test_stat; select table_rows from INFORMATION_SCHEMA.TABLES where table_schema='MASKING_TEST' and table_name='test_stat'; # Result: 1001 truncate test_stat; select table_rows from INFORMATION_SCHEMA.TABLES where table_schema='MASKING_TEST' and table_name='test_stat'; # Result: 0 analyze table MASKING_TEST.test_stat;

PostgreSQL

drop table if exists test."TEST_STAT"; create table test."TEST_STAT" ( id int ); SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; --Result: 0 insert into test."TEST_STAT" values (-1); SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; --Result: 0 !!! analyze test."TEST_STAT"; SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; -- Result: 1 truncate table test."TEST_STAT"; SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; -- Result: 0 insert into test."TEST_STAT" select * from generate_series(1, 1000); SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; -- Result: 0 !!! analyze test."TEST_STAT"; SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = 'test."TEST_STAT"'::regclass; -- Result: 1000

DB2 LUW

DROP TABLE IF EXISTS TEST.TEST_STAT ; CREATE TABLE TEST.TEST_STAT ( ID BIGINT ); INSERT INTO TEST.TEST_STAT VALUES (0); SELECT CARD FROM syscat.tables WHERE tabschema='TEST' AND tabname='TEST_STAT'; -- Result: -1 !!! CALL SYSPROC.ADMIN_CMD ('RUNSTATS ON TABLE TEST.TEST_STAT'); SELECT CARD FROM syscat.tables WHERE tabschema='TEST' AND tabname='TEST_STAT'; -- Result: 1 -- Insert 1000 rows INSERT INTO TEST.TEST_STAT WITH T (LVL) AS ( SELECT 1 AS LV FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT LVL+1 FROM T WHERE LVL < 1000 ) SELECT * FROM T; SELECT CARD FROM syscat.tables WHERE tabschema='TEST' AND tabname='TEST_STAT'; -- Result: 1 !!! CALL SYSPROC.ADMIN_CMD ('RUNSTATS ON TABLE TEST.TEST_STAT'); SELECT CARD FROM syscat.tables WHERE tabschema='TEST' AND tabname='TEST_STAT'; -- Result: 1001

SAP HANA Database

CREATE COLUMN TABLE "TEST1"."TAB03" ("COLUMN1" VARCHAR(100) NOT NULL , "COLUMN2" VARCHAR(100) NOT NULL , "COLUMN3" VARCHAR(100)) UNLOAD PRIORITY 5 AUTO MERGE ; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03'; --Result: 0 INSERT INTO "TEST1"."TAB03" VALUES ('ddd', 'fff', 'bbb'); COMMIT; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03'; --Result: 1 INSERT INTO "TEST1"."TAB03" VALUES ('ddd2', 'fff', 'bbb'); COMMIT; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03'; --Result: 2 CREATE ROW TABLE "TEST1"."TAB03_ROW" ("COLUMN1" VARCHAR(100) NOT NULL , "COLUMN2" VARCHAR(100) NOT NULL , "COLUMN3" VARCHAR(100)) ; INSERT INTO "TEST1"."TAB03_ROW" VALUES ('ddd', 'fff', 'bbb'); COMMIT; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03_ROW'; --Result: 1 DELETE FROM "TEST1"."TAB03_ROW"; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03_ROW'; --Result: 0 CREATE COLUMN TABLE "TEST1"."TAB03_COPY" AS (SELECT * FROM "TEST1"."TAB03"); SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03_COPY'; --Result: 2 TRUNCATE TABLE "TEST1"."TAB03_COPY"; SELECT RECORD_COUNT FROM "SYS"."M_TABLES" WHERE SCHEMA_NAME = 'TEST1' AND TABLE_NAME = 'TAB03_COPY'; --Result: 0

 

DB2 z/OS

CREATE TABLE TEST1.TAB06 ( COLUMN1 INTEGER ); SELECT CARDF FROM SYSIBM.SYSTABLES WHERE CREATOR = 'TEST1' AND NAME = 'TAB06'; --Result: -1 INSERT INTO TEST1.TAB06 values(1); INSERT INTO TEST1.TAB06 values(2); INSERT INTO TEST1.TAB06 values(3); SELECT CARDF FROM SYSIBM.SYSTABLES WHERE CREATOR = 'TEST1' AND NAME = 'TAB06'; --Result: -1 SELECT count(*) FROM TEST1.TAB06; --Result: 3 SELECT DBNAME||'.'||TSNAME FROM SYSIBM.SYSTABLES WHERE CREATOR = 'TEST1' AND NAME = 'TAB06'; --Result DSN03248.TAB06 CALL SYSPROC.DSNUTILU('RUNSTAT','NO','TEMPLATE TEMPL1 DSN IBMUSER.SYSUT1 UNIT SYSDA TEMPLATE TEMPL2 DSN IBMUSER.SORTOUT UNIT SYSDA TEMPLATE TEMPL3 DSN IBMUSER.SYSERR3 UNIT SYSDA RUNSTATS TABLESPACE(DSN03248.TAB06) TABLE(ALL) TABLESAMPLE SYSTEM AUTO UPDATE ALL ',1); SELECT CARDF FROM SYSIBM.SYSTABLES WHERE CREATOR = 'TEST1' AND NAME = 'TAB06'; --Result: 3

 

SYSPROC.DSNUTILU output:

1DSNU000I 136 09:55:21.73 DSNUGUTC - OUTPUT START FOR UTILITY, UTILID = RUNSTAT DSNU1045I 136 09:55:21.73 DSNUGTIS - PROCESSING SYSIN AS UNICODE UTF-8 0DSNU050I 136 09:55:21.74 DSNUGUTC - TEMPLATE TEMPL1 DSN IBMUSER.SYSUT1 UNIT SYSDA DSNU1035I 136 09:55:21.74 DSNUJTDR - TEMPLATE STATEMENT PROCESSED SUCCESSFULLY 0DSNU050I 136 09:55:21.74 DSNUGUTC - TEMPLATE TEMPL2 DSN IBMUSER.SORTOUT UNIT SYSDA DSNU1035I 136 09:55:21.74 DSNUJTDR - TEMPLATE STATEMENT PROCESSED SUCCESSFULLY 0DSNU050I 136 09:55:21.74 DSNUGUTC - TEMPLATE TEMPL3 DSN IBMUSER.SYSERR3 UNIT SYSDA DSNU1035I 136 09:55:21.74 DSNUJTDR - TEMPLATE STATEMENT PROCESSED SUCCESSFULLY 0DSNU050I 136 09:55:21.74 DSNUGUTC - RUNSTATS TABLESPACE(DSN03248.TAB06) TABLE(ALL) TABLESAMPLE SYSTEM AUTO UPDATE ALL DSNU610I -DBCG 136 09:55:21.75 DSNUSUTP - SYSTABLEPART CATALOG UPDATE FOR DSN03248.TAB06 SUCCESSFUL DSNU610I -DBCG 136 09:55:21.75 DSNUSUPT - SYSTABSTATS CATALOG UPDATE FOR TEST1.TAB06 SUCCESSFUL DSNU610I -DBCG 136 09:55:21.75 DSNUSUPC - SYSCOLSTATS CATALOG UPDATE FOR TEST1.TAB06 SUCCESSFUL DSNU610I -DBCG 136 09:55:21.75 DSNUSUTB - SYSTABLES CATALOG UPDATE FOR TEST1.TAB06 SUCCESSFUL DSNU610I -DBCG 136 09:55:21.75 DSNUSUCO - SYSCOLUMNS CATALOG UPDATE FOR TEST1.TAB06 SUCCESSFUL DSNU610I -DBCG 136 09:55:21.75 DSNUSUTS - SYSTABLESPACE CATALOG UPDATE FOR DSN03248.TAB06 SUCCESSFUL DSNU1374I -DBCG 136 09:55:21.75 DSNUSEF2 - SAMPLE SIZE USED : ROWS SAMPLED = 3 PAGES SAMPLED = 1 SAMPLE RATE USED = 100.00 REPEATABLE = 0 DSNU620I -DBCG 136 09:55:21.75 DSNUSEF2 - RUNSTATS CATALOG TIMESTAMP = 2023-05-16-09.55.21.749229 DSNU010I 136 09:55:21.76 DSNUGBAC - UTILITY EXECUTION COMPLETE, HIGHEST RETURN CODE=0

Related content