📅  最后修改于: 2023-12-03 14:54:08.747000             🧑  作者: Mango
在数据库中,存在着一种神秘的表,它被称为“幽灵表”。幽灵表是指在数据库中存在,但是无法通过正常的方式查询到它的表。始终存在的幽灵表会占用数据库中的资源,甚至会影响到数据库的性能。
幽灵表的成因有很多种,以下是一些常见的情况:
SELECT * INTO new_table FROM old_table
语句创建一个新表时,如果旧表不存在,新表仍然会被创建,但是它无法通过正常的方式查询。DROP TABLE table_name
语句删除表时,如果表不存在,该语句仍然会被执行成功。但是,在某些情况下,删除的表会变成幽灵表。要想检测幽灵表,需要使用一些系统表或视图。以下是一些常用的方法:
DBCC CHECKALLOC
命令sysindexes
、sysobjects
和 sys.partitions
sys.dm_db_index_operational_stats
和 sys.dm_db_partition_stats
要想剥离幽灵表,需要使用以下方法:
DROP TABLE
命令删除该表,如果该表不存在,则不会执行该命令。ALTER TABLE
命令将该表重命名为另一个名称,然后再将其改回原来的表名。这个过程会重新创建该表并清空所有数据。幽灵表是数据库中一种很诡异的现象。虽然它不会对数据库产生直接的影响,但是它可能会占用数据库的资源,并且影响到数据库的性能。在日常维护数据库时,我们需要关注这些幽灵表,并尽快剥离掉它们。
查询系统表 sysindexes
和 sys.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_stats
和 sys.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;