The number of rows in a table using table 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 Compute for a schema: begin |
Microsoft SQL | SELECT row_count FROM sys.dm_db_partition_stats OR with database name SELECT row_count FROM sys.dm_db_partition_stats | 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 | 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 | 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 | 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 | 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 |
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