You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测空表一周内是否有增删操作及无事务活动?

数据库空表操作记录与事务状态检测方案

针对清理未使用空表的需求,以下是不同主流数据库下,检测单表近一周是否有INSERT/DELETE操作、以及是否存在未提交事务的实用查询语句:

一、检测单表近7天的INSERT/DELETE操作

MySQL

-- 替换你的数据库名和目标表名
SELECT 
  table_name,
  update_time,
  last_insert,
  last_delete
FROM information_schema.TABLES t
LEFT JOIN performance_schema.table_io_waits_summary_by_table p
  ON t.table_schema = p.object_schema 
  AND t.table_name = p.object_name
WHERE 
  t.table_schema = 'your_db_name'
  AND t.table_name = 'target_table'
  AND t.update_time >= DATE_SUB(NOW(), INTERVAL 7 DAY);
  • 若结果为空,说明该表近一周无任何更新(含INSERT/DELETE)操作
  • update_time字段记录了表的最后修改时间

PostgreSQL

-- 替换目标表名
SELECT 
  relname AS table_name,
  n_tup_ins AS insert_count,
  n_tup_del AS delete_count,
  last_autovacuum
FROM pg_stat_user_tables
WHERE 
  relname = 'target_table'
  AND (n_tup_ins > 0 OR n_tup_del > 0)
  AND last_autovacuum >= NOW() - INTERVAL '7 days';
  • 返回空则表示近一周无INSERT/DELETE操作
  • n_tup_ins和n_tup_del分别记录累计插入、删除行数,可对比历史值确认近期变化

SQL Server

-- 替换你的数据库名和目标表名
SELECT 
  t.name AS table_name,
  i.last_user_update,
  i.user_seeks
FROM sys.tables t
LEFT JOIN sys.dm_db_index_usage_stats i
  ON t.object_id = i.object_id
  AND i.database_id = DB_ID('your_db_name')
WHERE 
  t.name = 'target_table'
  AND i.last_user_update >= DATEADD(DAY, -7, GETDATE());
  • last_user_update为空或早于7天前,说明近一周无写入操作

二、检测单表是否存在未提交事务

MySQL

-- 替换目标表名
SELECT 
  trx_id,
  trx_started,
  trx_state
FROM information_schema.INNODB_TRX
WHERE trx_tables_in_use LIKE '%target_table%';
  • 返回结果则表示有未提交的事务在操作该表

PostgreSQL

-- 替换目标表名
SELECT 
  pid,
  query_start,
  state,
  query
FROM pg_stat_activity
WHERE 
  state = 'idle in transaction'
  AND query LIKE '%target_table%';
  • 也可通过锁视图确认表级事务:
SELECT 
  locktype,
  relation::regclass AS table_name,
  mode,
  pid
FROM pg_locks
WHERE 
  relation = 'target_table'::regclass
  AND mode IN ('ACCESS EXCLUSIVE', 'ROW EXCLUSIVE');

SQL Server

-- 替换目标表名
SELECT 
  t.name AS table_name,
  s.session_id,
  s.transaction_id,
  s.start_time
FROM sys.dm_tran_session_transactions s
JOIN sys.dm_tran_locks l ON s.transaction_id = l.request_owner_id
JOIN sys.tables t ON l.resource_associated_entity_id = t.object_id
WHERE 
  t.name = 'target_table'
  AND s.status = 'active';

内容的提问来源于stack exchange,提问作者Burcin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:43:10