понедельник, 25 июля 2016 г.

DBCC CLONEDATABASE


В MS SQL Server 2014 после выхода 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 SQL 2014 SP2, в Microsoft SQL Server 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, которое так же помогает отслеживает поведение запросов в течение рабочего дня, но это уже другая история…

Комментариев нет :

Отправить комментарий