Когда SQL-сервер резервирует новое дисковое пространство и инициализирует его нулями.
Такое поведение можно отключить и как следствие сократить время выполнения некоторых операций и снизить нагрузку на дисковую подсистему.
Возможность резервировать дисковое пространство без инициализации называется Мгновенная инициализация файла (мгновенная инициализация файлов).
Эта особенность не очень известна, хотя ее использование стало возможным с тех пор, как SQL-сервер 2005 .
Какие преимущества вы можете получить от Мгновенная инициализация файла : 1. Ускорить создание новой базы данных 2. Уменьшите задержку и сократите время, необходимое для увеличения файлов данных.
3. Сократите время старта SQL-сервер , с момента инициализации база данных tempdb будет быстрее 4. Сократить время при восстановлении из резервной копии, т.к.
перед восстановлением SQL-сервер резервирует место для файлов, а затем переносит в них информацию из резервной копии.
Важно отметить, что Мгновенная инициализация файла Работает только для файлов данных (MDF и NDF).
Файлы журналов (LDF) всегда инициализируются нулевым значением.
Как использовать Мгновенная инициализация файла ? Все очень легко включается.
Открытие Диспетчер конфигурации SQL-сервера и узнаем под каким именем запущен наш экземпляр SQL-сервер .
Следующий через Локальная политика безопасности (Локальная политика безопасности) ищет Назначение прав пользователя (Название прав пользователя) – Выполнение задач по обслуживанию тома (Выполнение задач по обслуживанию тома)
Добавляем в настройки нужную нам личность, как показано на картинке.
Права, необходимые для работы Мгновенная инициализация файла , пример SQL-сервер проверяет только один раз - при запуске.
Поэтому нужно перезагрузить SQL-сервер чтобы наши настройки вступили в силу.
Теперь проведем эксперименты.
Для начала давайте проверим.
включен ли он Мгновенная инициализация файла ? Если он отключен, то при выполнении запроса:
В журнале видно, что файлы данных заполняются нулями:USE [master] GO IF DB_ID('IFI_DB') IS NOT NULL DROP DATABASE IFI_DB GO DBCC TRACEON(3004, 3605, -1) WITH NO_INFOMSGS CREATE DATABASE IFI_DB DBCC TRACEOFF(3004, 3605, -1) WITH NO_INFOMSGS GO IF DB_ID('IFI_DB') IS NOT NULL DROP DATABASE IFI_DB GO EXEC sp_readerrorlog 0, 1
Zeroing D:\DATABASES\SQL_2012\DATA\IFI_DB.mdf from page 0 to 520 (0x0 to 0x410000)
Zeroing completed on D:\DATABASES\SQL_2012\DATA\IFI_DB.mdf
Zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from page 0 to 130 (0x0 to 0x104000)
Zeroing completed on D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf
Starting up database 'IFI_DB'.
FixupLogTail(progress) zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from 0x5000 to 0x6000.
Zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from page 3 to 33 (0x6000 to 0x42000)
Zeroing completed on D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf
Но если Мгновенная инициализация файла включен, то нулями заполняется только файл журнала:
Zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from page 0 to 130 (0x0 to 0x104000)
Zeroing completed on D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf
Starting up database 'IFI_DB'.
FixupLogTail(progress) zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from 0x5000 to 0x6000.
Zeroing D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf from page 3 to 33 (0x6000 to 0x42000)
Zeroing completed on D:\DATABASES\SQL_2012\LOG\IFI_DB_log.ldf
Если лень смотреть лог, можно воспользоваться следующим скриптом:
USE [master]
GO
SET NOCOUNT ON;
IF DB_ID('IFI_DB') IS NOT NULL
DROP DATABASE IFI_DB
GO
IF OBJECT_ID('tempdb.dbo.#IFI') IS NOT NULL
DROP TABLE #IFI
GO
CREATE TABLE #IFI (dt DATETIME, info VARCHAR(50), txt VARCHAR(MAX))
GO
DBCC TRACEON(3004, 3605, -1) WITH NO_INFOMSGS
CREATE DATABASE IFI_DB
DBCC TRACEOFF(3004, 3605, -1) WITH NO_INFOMSGS
GO
IF DB_ID('IFI_DB') IS NOT NULL
DROP DATABASE IFI_DB
GO
INSERT INTO #IFI
EXEC sp_readerrorlog 0, 1, 'Zeroing'
IF EXISTS(
SELECT 1
FROM #IFI
WHERE txt LIKE 'Zeroing completed%'
AND txt LIKE '%IFI_DB.mdf%'
AND dt > DATEADD(HOUR, -1, dt)
)
PRINT 'Instant File Initialization = OFF'
ELSE
PRINT 'Instant File Initialization = ON'
Если вам необходимо временно отключить Мгновенная инициализация файла , то можно включить флаг трассировки 1806. Но как показывает практика, возможность использования этого функционала существенно экономит время и снижает нагрузку на диск.
Вот пара тестовых примеров и время их запустить Мгновенная инициализация файла и без: USE [master]
GO
IF DB_ID('IFI_DB') IS NOT NULL
Теги: #мгновенная инициализация файла #sql-сервер #sql #Microsoft SQL Server
-
Гугл Ответы
19 Oct, 24 -
Google Ищет Лоббистов В Европе
19 Oct, 24 -
Боевое Применение Мультикоптера В Сирии
19 Oct, 24 -
Как Избежать Ошибок При Заказе Сайта
19 Oct, 24 -
Таблица Дроидов. Выпуск 19
19 Oct, 24