Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как найти все пустые файлы в базе  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
Добрый день,

Мне нужно найти все пустые файлы в базе (после архивирования партиционной таблицы остаются)

Пробовал нечто такое:
select f.name, *
from sysfiles f (nolock)
left join sys.filegroups fg (nolock)
on f.name = fg.name
left join sys.indexes i (nolock) 
on i.data_space_id = fg.data_space_id
left join sys.all_objects o (nolock)
ON i.[object_id] = o.[object_id]
where i.name is NULL and o.name is NULL


Не получается. Выдает все.

Есть идеи?

Спасибо.

P.S.: у меня имя файла и имя его файл группы совпадают, поэтому я join делал по имени.
5 май 15, 08:18    [17600064]     Ответить | Цитировать Сообщить модератору
 Re: Как найти все пустые файлы в базе  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
Забыл упомянуть, мы используем SQL Server 2008 R2 SP2.
5 май 15, 08:23    [17600074]     Ответить | Цитировать Сообщить модератору
 Re: Как найти все пустые файлы в базе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Roust_m
Пробовал нечто такое:
Вы ИМХО left join-ами злоупотребляете
Сделайте from sysfiles join sys.filegroups, и потом not exists для индексов
5 май 15, 08:38    [17600104]     Ответить | Цитировать Сообщить модератору
 Re: Как найти все пустые файлы в базе  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
alexeyvg
Roust_m
Пробовал нечто такое:
Вы ИМХО left join-ами злоупотребляете
Сделайте from sysfiles join sys.filegroups, и потом not exists для индексов


Тоже самое получается, выдает все.
5 май 15, 08:51    [17600139]     Ответить | Цитировать Сообщить модератору
 Re: Как найти все пустые файлы в базе  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Roust_m
Тоже самое получается, выдает все.
Так вы код отладьте, посмотрите, почему так получается.

Ведь не доля всех sys.indexes указаны валидные data_space_id.
Почему так? Ответ есть в хелпе:
BOL
0 = object_id is a table-valued function or in-memory index.
5 май 15, 11:05    [17600927]     Ответить | Цитировать Сообщить модератору
 Re: Как найти все пустые файлы в базе  [new]
o-o
Guest
alexeyvg
Ведь не доля всех sys.indexes указаны валидные data_space_id.
Почему так? Ответ есть в хелпе:
BOL
0 = object_id is a table-valued function or in-memory index.

вы немного не туда ушли.
2008 R2 еще не знал таких ругательных слов как in-memory index,
a table-valued function нет в его фг, т.к. он же ищет "все пустые файлы в базе (после архивирования партиционной таблицы остаются)".

промах здесь в том, что
sys.indexes.data_space_id это ID of the data space for this index. Data space is either a filegroup or partition scheme.
т.е. как минимум никогда не отловятся партицированные объекты,
у них точно в sys.indexes.data_space_id стоит совсем не то, что в sys.filegroups.data_space_id.
в общем, вместо того, чтобы искать, что там не то соединилось в запросе ТС,
предлагаю пойти через sys.allocation_units, где data_space_id это ID of the filegroup in which this allocation unit resides.
без всяких "или ...или".
в CTE выбирается лишнее, это для проверки того, что оно вообще выбирает.
with cte as
(
select OBJECT_NAME(p.object_id) as obj_name, 
       fg.data_space_id,
       fg.name,
       fg.type_desc
from sys.partitions p inner join sys.allocation_units au 
        on au.container_id = p.hobt_id 
     inner join sys.filegroups fg 
        on fg.data_space_id = au.data_space_id 
--where fg.name <> 'PRIMARY'
)        
select file_id, type_desc, name
from   sys.master_files m
where  m.database_id = DB_ID()
	and not exists (select * 
			from cte c
			where c.data_space_id = m.data_space_id);
5 май 15, 17:03    [17603448]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить