Решил сжать и красиво разложить таблицы из большой базы по разным файловым группам (основная задача была уменьшить объём базы, но поскольку уменьшение объёма файла приводит к сильному росту фрагментации, решил пересоздать индексы в отдельных файловых группах). В процессе возникло два вопроса:
1) Есть пустая таблица (data_pages = 0) — как перенести её в другую группу? Обычным CREATE CLUSTERED INDEX WITH(DROP_EXISTING) не получается — после отработки команды всё по прежнему. А удалить кластерный индекс не выходит, поскольку на него завязан первчиный ключ.
2) После переноса всех таблиц, согласно такому запросу:
select t.name, i.name, i.type_desc, fg.name, a.total_pages, a.data_pages, p.rows
from sys.filegroups fg
join sys.allocation_units a on a.data_space_id = fg.data_space_id
join sys.partitions p on p.partition_id = a.container_id
join sys.indexes i on i.object_id = p.object_id and i.index_id = p.index_id
join sys.tables t on t.object_id = i.object_id
where t.name = 'MyTable'
order by a.total_pages desc
Table Index type FG total_pages data_pages rows
===== ===== ==== == =========== ========== ====
MyTable MyTable_CL CLUSTERED PRIMARY 6437066 0 6644
MyTable MyTable_CL CLUSTERED work 57 48 6644
То есть два кластерных индекса, один из которых не содержит данных, зато содержит 50GB непонятных страниц и мешает уменьшить файл.
Перенос проводился через CREATE CLUSTERED INDEX WITH(DROP_EXISTING).
ARI ARI ARI... Arrivederci!
ARI ARI ARI... Arrivederci!