达梦数据库获取每个数据库表的总条数及业务实战
达梦数据库获取每个数据库表的总条数
dba_tables表/all_tables表
在达梦数据库中,有一个dba_tables隐藏系统表里面会记录着每个数据库表的总条数(行数),但是这表的数据不是实时的,需要手动更新里面的数据
SELECT table_name,num_rows FROM dba_tables where owner = 'SS_MZ'
上面sql通过owner来指定模式为SS_MZ,如果不需要指定可以去掉这个筛选条件
默认情况下,这个dba_tables的num_rows都NULL,这是因为需要手动去更新表的总条数,可以通过下面的方式手动更新统计信息
也可以通过sql来更新,指定模式名和表名即可,执行DBMS_STATS.GATHER_TABLE_STATS函数后就会更新dba_tables表里面的num_rows为最新的统计数据
DBMS_STATS.GATHER_TABLE_STATS('xx', -- Schema模式名v_table_name, -- 动态传入表名null, -- Column名null, -- Partnamefalse, -- No_invalidatenull -- Estimate_percent
);
好文参考:达梦数据库查询各表数据量/以及达梦更新统计信息-CSDN博客
使用游标动态更新多个表上的统计信息
DECLAREv_table_name VARCHAR(256);CURSOR table_cursor ISSELECT TABLE_NAMEFROM TABLE;
BEGINOPEN table_cursor;LOOPFETCH table_cursor INTO v_table_name;EXIT WHEN table_cursor%NOTFOUND;-- 调用统计信息收集函数CALL DBMS_STATS.GATHER_TABLE_STATS('DATABASE', -- Schema模式名【其实就是库名】v_table_name, -- 动态传入表名null, -- Column名null, -- Partnamefalse, -- No_invalidatenull -- Estimate_percent);END LOOP;CLOSE table_cursor;
END;
骚戴理解:该 SQL 代码使用游标动态收集多个表上的统计信息。上面TABLE表里面TABLE_NAME字段存储的是数据库表名,然后把这个表名存储到v_table_name 中,通过游标来实现遍历,在遍历的过程中,对于每个表名,调用 DBMS_STATS.GATHER_TABLE_STATS 函数收集更新表统计信息(执行DBMS_STATS.GATHER_TABLE_STATS函数后就会更新dba_tables表里面的num_rows为最新的统计数据),在使用这个函数的时候需要指定模式名,例如上面的SS_MZ_DATA模式。这里我的业务场景是更新某个业务表里面存储的所有表的统计行数据,也就是我有一个业务表,里面有个字段存储着表名,我需要更新这些数据表的行数统计,因为在达梦数据库中,有一个dba_tables隐藏系统表里面会记录着每个数据库表的总条数(行数),但是这表不是实时的,需要手动更新里面的数据,所以才需要通过上面的游标去遍历,然后手动更新每个表的总条数(也就是调用DBMS_STATS.GATHER_TABLE_STATS函数来实现)。