📜  幽灵表剥离表(1)

📅  最后修改于: 2023-12-03 14:54:08.747000             🧑  作者: Mango

幽灵表剥离表

在数据库中,存在着一种神秘的表,它被称为“幽灵表”。幽灵表是指在数据库中存在,但是无法通过正常的方式查询到它的表。始终存在的幽灵表会占用数据库中的资源,甚至会影响到数据库的性能。

幽灵表的成因

幽灵表的成因有很多种,以下是一些常见的情况:

  • 当你使用 SELECT * INTO new_table FROM old_table 语句创建一个新表时,如果旧表不存在,新表仍然会被创建,但是它无法通过正常的方式查询。
  • 当你使用 DROP TABLE table_name 语句删除表时,如果表不存在,该语句仍然会被执行成功。但是,在某些情况下,删除的表会变成幽灵表。
  • 在Oracle数据库中,如果使用了DDL语句后,再使用ROLLBACK语句将其回滚,则该表可能会变成幽灵表。
如何检测和剥离幽灵表
检测幽灵表

要想检测幽灵表,需要使用一些系统表或视图。以下是一些常用的方法:

  • 使用 DBCC CHECKALLOC 命令
  • 查询系统表 sysindexessysobjectssys.partitions
  • 查询系统视图 sys.dm_db_index_operational_statssys.dm_db_partition_stats
剥离幽灵表

要想剥离幽灵表,需要使用以下方法:

  • 使用 DROP TABLE 命令删除该表,如果该表不存在,则不会执行该命令。
  • 使用 ALTER TABLE 命令将该表重命名为另一个名称,然后再将其改回原来的表名。这个过程会重新创建该表并清空所有数据。
总结

幽灵表是数据库中一种很诡异的现象。虽然它不会对数据库产生直接的影响,但是它可能会占用数据库的资源,并且影响到数据库的性能。在日常维护数据库时,我们需要关注这些幽灵表,并尽快剥离掉它们。

代码片段

查询系统表 sysindexessys.objects,并统计幽灵表的数量:

SELECT COUNT(*) AS ghost_tables FROM sys.partitions p JOIN sys.objects o ON p.object_id = o.object_id WHERE p.index_id IN (0, 1) AND o.type = 'U' AND o.is_ms_shipped = 0 AND NOT EXISTS (SELECT 1 FROM sys.dm_db_partition_stats s WHERE p.partition_id = s.partition_id);

查询系统视图 sys.dm_db_index_operational_statssys.dm_db_partition_stats,并统计幽灵表的数量:

SELECT COUNT(*) AS ghost_tables FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) stat JOIN sys.partitions part ON stat.object_id = part.object_id AND stat.index_id = part.index_id LEFT JOIN sys.dm_db_partition_stats ps ON part.partition_id = ps.partition_id WHERE ps.object_id IS NULL;