SQL Server: файлы идентификаторов сценариев потерянных файлов, отсутствующие в схемах / индексах разделов. Возвращает файл, который при попытке удаления SQL Server выдает «не пуст»
a) что еще можно сделать с этим сценарием, чтобы он возвращал только "потерянные" файлы - "потерянные" файловую группу / файл, не связанный со схемой или индексом раздела?
b) если этого достаточно, как может получиться, что один из файлов вернулся, когда выдан файл удаления alter db - db выдает «not empty»?
b1) файл / файловая группа когда-то была частью раздела, но была объединена. Проверено этим в sql &, посмотрев @ схемы разделов
b2) файл показывает размер 128, который я наблюдал как наименьший возможный размер файла
WITH cte_file_relations
AS(
SELECT
related_to_nothing = CASE WHEN dataspaces_n_indexes.data_space_id IS NULL
AND dds.partition_scheme_id IS NULL
AND ds_alloc_units.data_space_id IS NULL
AND dataspaces_n_full_text_indexes.data_space_id IS NULL
THEN 1
ELSE 0 END
--
, [file_group_name] = fg.name
, filegroup_type_desc = fg.type_desc
, [filegroup_is_empty] = CASE WHEN df.data_space_id IS NULL THEN 1 ELSE 0 END
--
, [file_logical_name] = df.name
, [file_phys_name] = df.physical_name
, [file_empty?] = CASE df.size WHEN 128 THEN ''looks empty'' ELSE ''NOT empty'' END
--
, part_of_Partition_Scheme = CASE WHEN dds.partition_scheme_id IS NULL THEN 0 ELSE 1 END
, part_of_index = CASE WHEN dataspaces_n_indexes.data_space_id IS NULL THEN 0 ELSE 1 END
, part_of_full_text_index = CASE WHEN dataspaces_n_full_text_indexes.data_space_id IS NULL THEN 0 ELSE 1 END
, part_of_alloc_units = CASE WHEN ds_alloc_units.data_space_id IS NULL THEN 0 ELSE 1 END
FROM
sys.filegroups fg WITH ( NOLOCK )
LEFT JOIN sys.database_files df WITH ( NOLOCK )
ON fg.data_space_id = df.data_space_id
LEFT JOIN sys.destination_data_spaces dds
ON fg.data_space_id = dds.data_space_id
LEFT JOIN ( SELECT i.data_space_id FROM sys.indexes i GROUP BY i.data_space_id ) dataspaces_n_indexes
ON fg.data_space_id = dataspaces_n_indexes.data_space_id
LEFT JOIN ( SELECT i.data_space_id FROM sys.fulltext_indexes i GROUP BY i.data_space_id ) dataspaces_n_full_text_indexes
ON fg.data_space_id = dataspaces_n_full_text_indexes.data_space_id
LEFT JOIN ( SELECT data_space_id FROM sys.allocation_units GROUP BY data_space_id ) ds_alloc_units
ON fg.data_space_id = ds_alloc_units.data_space_id
)
select *
from cte_file_relations
WHERE related_to_nothing = 1
По догадке друзей, я пошел, чтобы сжать файл и посмотреть, что всего 1 МБ - 0,88 МБ бесплатно. Затем я посмотрел @ другие файлы, которые я ожидал пустыми. Большинство из них при общем объеме 1 МБ показывают свободное пространство в размере 0,94 МБ.