Очистка базы данных MSSQL - Как найти неиспользуемые объекты (таблицы, представления, процедуры, функции) - PullRequest
8 голосов
/ 02 января 2009

Допустим, вы унаследовали базу данных MS SQL 2000 или 2005 и знаете, что некоторые из таблиц, представлений, процедур и функций фактически не используются в конечном продукте.

Есть ли какая-то внутренняя регистрация или другой механизм, который может сказать мне, какие объекты НЕ вызываются? или звонили только несколько раз против тысячи раз.

Ответы [ 3 ]

7 голосов
/ 04 января 2009

Этот вопрос SO, Определение неиспользуемых объектов В Microsoft SQL Server 2005 , может иметь отношение

4 голосов
/ 02 января 2009

Ответ будет немного зависеть от того, как база данных была собрана, но мой подход к подобной проблеме был трехкратным:

Выясните, какие объекты не имеют внутренних зависимостей. Вы можете решить это из запросов к системным зависимостям, таким как:

select 
    id, 
    name
from
    sys.sysdepends sd
inner join sys.sysobjects so
    on so.id = sd.id
where 
    not exists (
        select 
            1
        from 
            sysdepends sd2
        where 
            sd2.depid = so.id
    )

Вы должны объединить это с сбором типа объекта (sysobjects.xtype), поскольку вам нужно будет только изолировать таблицы, функции, хранимые процедуры и представления. Также игнорируйте любые процедуры, начинающиеся с sp_, если только люди не создавали процедуры с этими именами для вашего приложения!

Многие из возвращенных процедур могут быть точками входа вашего приложения. То есть процедуры, которые вызываются из уровня вашего приложения или из какого-либо другого удаленного вызова и не имеют никаких объектов, которые зависят от них в базе данных.

Предполагая, что процесс не будет слишком инвазивным (он создаст дополнительную нагрузку, хотя и не слишком большую), теперь вы можете включить некоторое профилирование событий SP: Starting, SQL: BatchStarting и / или SP: StmtStarting. Запускайте это столько времени, сколько считаете нужным, в идеале входя в таблицу sql для облегчения перекрестных ссылок. Вы должны быть в состоянии устранить многие из процедур, которые вызываются непосредственно из вашего приложения.

Перекрестные ссылки на текстовые данные из этого журнала и списка зависимых объектов позволят выделить большинство неиспользуемых процедур.

Наконец, вы можете взять список кандидатов, полученный в результате этого процесса, и сопоставить с ними базу исходного кода. Это громоздкая задача, и если вы найдете ссылки в своем коде, это не значит, что они вам нужны! Может просто случиться так, что код не был удален, хотя теперь он логически недоступен.

Это далеко не идеальный процесс. Относительно чистой альтернативой является настройка гораздо более подробного (и, следовательно, инвазивного) профилирования на сервере для мониторинга всей активности. Это может включать в себя все операторы SQL, вызываемые во время активности журнала. Затем вы можете вернуться через зависимые таблицы или даже кросс-зависимости базы данных из этих текстовых данных. Я обнаружил надежность деталей журнала (слишком большое количество строк в секунду при попытке анализа) и огромное количество данных, с которыми трудно иметь дело. Если ваше приложение менее подвержено этому, то это может быть хорошим подходом.

Оговорка:

Потому что, насколько мне известно, не существует идеального ответа на этот вопрос, особенно опасаться удаления таблиц. Процедуры, функции и представления легко заменяются, если что-то идет не так (хотя, конечно, убедитесь, что они есть в контроле исходного кода, прежде чем записывать их!). Если вы действительно нервничаете, почему бы не переименовать таблицу и создать представление со старым именем, тогда у вас все получится.

3 голосов
/ 07 января 2011

Мы также можем найти неиспользуемые столбцы и таблицу, используя следующий запрос. Я устал писать курсор. Курсор предоставит вам информацию о каждом столбце и каждой таблице.

declare @name varchar(200), @id bigint, @columnname varchar(500)
declare @temptable table
(
 table_name varchar(500),
 Status bit
)
declare @temp_column_name table 
(
 table_name varchar(500),
 column_name varchar(500),
 Status bit
)


declare find_table_dependency cursor for
select name, id from sysobjects where xtype ='U'
open find_table_dependency
fetch find_table_dependency into @name, @id
while @@fetch_Status = 0
begin

 if exists(select top 1 name from sysobjects where id in 
   (select id from syscomments where text like '%'+@name +'%'))
  insert into @temptable
  select @name, 1
 else 
  insert into @temptable
  select @name, 0

 declare find_column_dependency cursor for
    select name from syscolumns where id = @id
 open find_column_dependency
 fetch find_column_dependency into @columnname
 while @@fetch_Status = 0
 begin

  if exists(select top 1 name from sysobjects where id in 
   (select id from syscomments where text like '%'+@columnname +'%'))
   insert into @temp_column_name
   select @name,@columnname, 1
  else 
   insert into @temp_column_name
   select @name,@columnname, 0

  fetch find_column_dependency into @columnname
 end
 close find_column_dependency
 deallocate find_column_dependency


 fetch find_table_dependency into @name, @id
end
close find_table_dependency
deallocate find_table_dependency

select * from @temptable
select * from @temp_column_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...