为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1企业版
【操作系统】:
【CPU】:
【问题描述】:
count()统计的
行数为0,大小显示273m
dba_tables的字段num_rows统计
这么看该表的行数是0了,是不是有什么缓存之类的?所以上面显示273m
随机查了一个其他的表,两种统计方式是一致的
COUNT(*) 是实时统计,dba_tables中的内容请更新该表的统计信息然后再进行查看。
可能是数据删除后还未提交。或是删除之后统计信息还没有更新,可以检查一下待提交事务,或者调整统计信息收集频率:
事务检查:
SELECT
DS.SESS_ID "被阻塞的会话ID",
DS.SQL_TEXT "被阻塞的SQL",
DS.TRX_ID "被阻塞的事务ID",
(
CASE L.LTYPE
WHEN 'OBJECT' THEN
'对象锁'
WHEN 'TID' THEN
'事务锁'
END
CASE) "被阻塞的锁类型",
DS.CREATE_TIME "开始阻塞时间",
SS.SESS_ID "占用锁的会话ID",
SS.SQL_TEXT "占用锁的SQL",
SS.CLNT_IP "占用锁的IP",
L.TID "占用锁的事务ID"
FROM
V$LOCK L
LEFT JOIN V$SESSIONS DS ON DS.TRX_ID = L.TRX_ID
LEFT JOIN V$SESSIONS SS ON SS.TRX_ID = L.TID
WHERE
L.BLOCKED = 1
统计信息:
--打开表数据量监控开关,参数值为 1 时监控所有表,2 时仅监控配置表
SP_SET_PARA_VALUE(1,'AUTO_STAT_OBJ',2);
--设置 SYSDBA.T 表数据变化率超过 15% 时触发自动更新统计信息
DBMS_STATS.SET_TABLE_PREFS('SYSDBA','T','STALE_PERCENT',15);
--配置自动收集统计信息触发时机
SP_CREATE_AUTO_STAT_TRIGGER(1, 1, 1, 1,'14:36', '2020/3/31',60,1);
/*
函数各参数介绍
SP_CREATE_AUTO_STAT_TRIGGER(
TYPE INT, --间隔类型,默认为天
FREQ_INTERVAL INT, --间隔频率,默认 1
FREQ_SUB_INTERVAL INT, --间隔频率,与 FREQ_INTERVAL 配合使用
FREQ_MINUTE_INTERVAL INT, --间隔分钟,默认为 1440
STARTTIME VARCHAR(128), --开始时间,默认为 22:00
DURING_START_DATE VARCHAR(128), --重复执行的起始时间,默认 1900/1/1
MAX_RUN_DURATION INT, --允许的最长执行时间(秒),默认不限制
ENABLE INT --0 关闭,1 启用 --默认为 1
);
*/
可以看下dba_tables视图的定义,其是从sysstat统计信息表中获取的 该统计值不是实时的,只是当时统计信息收集时刻该表的记录数,所以与实际查的count行数不一样