Автор: dbasimple
В MS SQL Server2014 после выхода SP2 появилась новая команда DBCC, команда
DBCC CLONEDATABASE
Данная команда создает новую базу данных с содержанием схему всех объектов и статистики исходной базы данных.
Более подробно это описано в kb 3177838.
Там же описано более подробное назначение данной команды:
«Команда поддержки Майкрософт может вас попросить создать клон вашей базы данных данной команды для исследования проблемы производительности связанная с оптимизатором запросов.»
И там же примечание: что созданную данной командой базу данных не использовать как продукционную базу данных, а использовать для диагностических целей.
Что делает данная команда по шагам:
— создает новую базу данных согласно базе данных model(размер файлов и их приращение)
— создает внутренний моментальный снимок исходной базы данных
— копируется системные и пользовательские объекты из исходной базы данных в новую базу данных
— Копирует данные статистики из исходной базы данных без самих данных в базе (в документации указана статистика индексов, но на самом деле всю статистику в базе).
Для последнего пункта скорее всего и создавалась данная команда, скопировать статистику в базе без самих данных в базе данных и уже по этой статистике анализировать поведение проблемных запросов.
Вообще, я думаю, причиной создания данной команды, наверно, стало много обращений в поддержку Майкрософт, почему запрос выполнялся хорошо, а потом плохо, а для объяснения и проверки поведения оптимизатора запросов не хватало информации по статистике, поэтому поддержка Майкрософт попросила у разработчиков данную команду, в итоге теперь для анализа нужно отдавать только клон бд без данных, что намного меньше в объеме.
Синтаксис команды:
Он довольно простой
DBCC CLONEDATABASE (source_database_name, target_database_name)
Кто сможет выполнить данную команду — пользователи сервера с правами sysadmins.
Пример выполнения:
Есть база данных db1, в ней таблица с данными, на таблице созданы 2 индекса, а также дополнительная статистика без индекса.
После выполнения команды
DBCC CLONEDATABASE(db1,db1_clone)
Создается база данных «db1_clone» в статусе Read-Only.
Размещение файлов, там же где и исходная
DB_Name physical_name
db1 C:\data\db1.mdf
db1 C:\data\db1_log.ldf
db1_clone C:\data\db1_1992956780.mdf
db1_clone C:\data\db1_log_1697443590.ldf
к файлам дописывается случайное числовое значение.
А вот физически параметры файлов бд взяты от model
А теперь к внутренностям клонированной базы данных:
В ней есть все объекты исходной базы данных:
Но без данных:
Но зато осталась дата обновления статистики и ее распределение в таблице:
Что и нужно для оптимизатора запросов при построение плана запроса.
Кстати такой командой можно выполнять несколько раз в день, а потом анализировать, как меняется распределение данных в течение рабочего дня и как после этого меняется план запроса на вашей промышленной системе.
Еще раз, данная команда появилась в MS SQL2014 SP2, в Microsoft SQLServer 2016 (RTM) — 13.0.1601.5 (X64)
данной команды пока нет, при выполнении будет ошибка
Msg 2526, Level 16, State 3, Line 1
Incorrect DBCC statement. Check the documentation for the correct DBCC syntax and options.
Так же замечание, команда может не всегда выполняться, есть ошибки, как описаны здесь, либо как у меня на одном сервере просто ошибка, хотя точно такую же базу данных я использовал выше.
Database cloning for ‘DB1’ has started with target as ‘DB1_clone’.
Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.
А так неплохое средство для диагностики поведения запросов на промышленной среде со временем и от зависимости данных в таблицах. В MS SQL 2016 есть QUERY STORE, которое так же помогает отслеживает поведение запросов в течение рабочего дня, но это уже другая история…