2010-08-30 2 views
3

Я не уверен, можно ли задать этот вопрос здесь или serverfault. Мне было интересно ... Есть ли способ быстро отменить изменения, внесенные SQL Server 2005 Tuning Advsor, кроме восстановления из резервной копии?Отменить изменения, сделанные с помощью SQL Server Database Tuning

+0

Я думал, что советник по настройке сгенерировал скрипт для запуска, а не внес изменения в базу данных - если это так, отменить нечего. – adrianbanks

+0

@adrianbanks: Существует возможность автоматического применения рекомендаций. См. [Как выполнять рекомендации по настройке] (http://msdn.microsoft.com/en-us/library/ms175529.aspx) –

ответ

4

Существует способ до тех пор, пока вы не переименовал их обычно Database Tuning Advisor генерироваться объекты с префиксом _dta

enter image description here

так что вы можете просматривать их, запустив этот запрос

ДЛЯ индексов

SELECT   
* 
FROM    
sys.indexes where name like '_dta%' 

ИЗ Статистика

SELECT 
* 
FROM 
sys.stats where name like '_dta%' 

И оттуда я думаю, вы должны знать, какие элементы уронить

+0

эй raymund, по какой причине вы размыли имена? –

2

Там нет официальной ссылки на UNDO этой операции, так как не будет официальным рекомендации по восстановлению после DROP DATABASE. Ответственный администратор базы данных просто не делает этого.

Если вы только что сделали это и были счастливы, вы, скорее всего, оставили имена в качестве значений по умолчанию, что очень помогает. Ответ Раймунда почти есть. Но если вы сделали это со временем, тогда вы не захотите UNDO все хорошие показатели и индексы. Вторая часть головоломки - проверить, когда индексы были в последний раз обновлены. Если вы только что сделали это несколько минут назад, что является хорошим временем для UNDO внутри, проверьте этот запрос, чтобы получить индексы и статистику, которые только что были восстановлены.

SELECT object_name(object_id) tablename, 
     name indexname, 
     nullif(name,name) statsname, 
     STATS_DATE(object_id, index_id) lastupdated 
    from sys.indexes 
    where STATS_DATE(object_id, index_id) >= dateadd(hh,-1,getdate()) 
    -- and name like '_dta%' 
    union all 
    SELECT object_name(object_id) tablename, 
     nullif(name,name) indexname, 
     name statsname, 
     STATS_DATE(object_id, stats_id) lastupdated 
    from sys.stats 
    where STATS_DATE(object_id, stats_id) >= dateadd(hh,-1,getdate()) 
    -- and name like '_dta%' 
order by lastupdated desc 

Это фильтрует список вниз только индексы, которые были ОБНОВЛЕНО в последний час. Тем не менее, авто-статистика обычно включена по умолчанию, а также периодически перестраивает статистику, поэтому вы не захотите отбрасывать все показаны показанные индексы. Разоблачение and name like '_dta%' было бы началом, если вы не переименовали их - и в этом случае вы можете вспомнить, на что вы их назвали?

1

Я часто использую psuedo-dynamic SQL, чтобы генерировать SQL-выражения, которые мне нужны. это приведет к сбросу всех индексов, начинающихся с префикса _dta.

ВЫБОРА
'индекса падение' + ИМЯ_ОБЪЕКТ (object_id) +. [ '+ Имя + ']' ИЗ
таблицы sys.indexes где имя как '%' _dta

вставить результаты из это в новое окно, а затем я должен дважды проверить каждый индекс вручную перед отбрасыванием.

также, что вы можете сделать то же самое для бросающих статистики

ВЫБРАТЬ
'указательного падения' + OBJECT_NAME (object_id) + '[' + имя + ']' ИЗ
SYS.stats где name like '_dta%'