
مفهوم Instant File Initialization در SQL Server
مفهوم Instant File Initialization در SQL Server، در این مقاله قصد داریم شما رو با مفهوم Instant Initialization که مبحث مهمی در Performance پایگاه داده SQL Server است، آشنا کنیم. فایل های دیتا و لاگ هنگام انجام هر یک از اعمال زیر آماده سازی اولیه (File Initialization) می شوند. تا داده هایی که از فایل های پاک شده روی دیسک باقی مانده با مقدار صفر رونویسی شوند.
- ایجاد دیتابیس
- اضافه کردن فایل داده یا لاگ به دیتابیس
- افزایش اندازه یک فایل موجود (شامل عملیات auto growth هم می شود)
- restore یک دیتابیس یا Filegroup
مفهوم Instant File Initialization در SQL Server
SQL Server فرآیند نادیده گرفتن Zero Initialization را تنها می تواند در مورد DATA File ها اعمال کند. Zero Initialization در مورد transaction log اجباری است چون طبیعت این فایل چرخشی است یعنی پس از رسیدن به انتهای فایل SQL Server دوباره از ابتدای فایل شروع به رونویسی روی لاگ های قدیمی می کند (به این عمل Warp-around هم گفته می شود) و علت اجباری بودن هم مربوط به روند اجرای recovery است که فایل لاگ را می خواند و با رسیدن به مقدار صفر به این فرآیند خاتمه می دهد (این موضوع را در یک مقاله دیگر پوشش می دهم). برای فعال کردن قابلیت Instant Initialization باید به اکانت سرویس SQL Server مجوز “Perform Volume Maintenance Tasks” داده شود. شما میتوانید کوئری نویسی را به صورت گامبهگام از نیک آموز فرا بگیرید.
فعال کردن قابلیت Instant Initialization در SQL Server
در این بخش می خواهیم نحوه فعال کردن این قابلیت در SQL Server را برای شما علاقه مندان به پایگاه داده توضیح دهیم:
پیدا کردن اکانت سرویس SQL Server می توانید از اسکریپت زیر استفاده کنید:
DECLARE @DBEngineLogin VARCHAR(100)
EXECUTE master.dbo.xp_instance_regread
@rootkey = N'HKEY_LOCAL_MACHINE',
@key = N'SYSTEMCurrentControlSetServicesMSSQLServer',
@value_name = N'ObjectName',
@value = @DBEngineLogin OUTPUT
SELECT [DBEngineLogin] = @DBEngineLogin
<span style="color: #000000;">CREATE DATABASE TestDatabase ON PRIMARY ( NAME = N'TestDatabase', FILENAME = N'G:SQLDATATestDatabase.mdf' , SIZE = 51200000KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TestDatabase_log', FILENAME = N'G:SQLLogTestDatabase_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10% ) GO</span> <span style="color: #000000;">CREATE DATABASE TestDatabase ON PRIMARY
(
NAME = N'TestDatabase',
FILENAME = N'G:SQLDATATestDatabase.mdf' ,
SIZE = 51200000KB ,
FILEGROWTH = 1024KB
)
LOG ON
(
NAME = N'TestDatabase_log',
FILENAME = N'G:SQLLogTestDatabase_log.ldf' ,
SIZE = 1024KB ,
FILEGROWTH = 10%
)
GO</span> CREATE DATABASE TestDatabase ON PRIMARY
(
NAME = N'TestDatabase',
FILENAME = N'G:SQLDATATestDatabase.mdf' ,
SIZE = 51200000KB ,
FILEGROWTH = 1024KB
)
LOG ON
(
NAME = N'TestDatabase_log',
FILENAME = N'G:SQLLogTestDatabase_log.ldf' ,
SIZE = 1024KB ,
FILEGROWTH = 10%
)
GO
|
برای ساخت دیتابیس بالا SQL Server باید ۵۰ GB مقدار ۰ را روی دیسک بنویسد! و البته این کار با فراخوانی یک تابع API ویندوز به نام SetFileValidData انجام می شود. افراد علاقهمند میتوانند با مطالعه مقاله پرکاربردترین دستورات SQL Server، دانش خود را در زمینه کوئرینویسی گسترش دهند.
در تصویر زیر که لاگ SQL است میتوانید از یک نمونه فرآیند ساخت دیتابیس تا قبل از دادن مجوز Perform Volume Maintenance Tasks به اکانت SQL Server را مشاهده می کنید و همانطور که می بینید پر کردن با صفر هم برای فایل داده ای و هم لاگ انجام شده است.
سخن پایانی
مفهوم Instant File Initialization در SQL Server، پس از دادن مجوز Perform Volume Maintenance Tasks و فعال کردن دو trace flag با شماره های ۳۰۰۴ و ۳۶۰۵ (با دستور DBCC TRACEON (۳۶۰۵)) و اجرای مجدد اسکریپت ساخت دیتابیس می توانید در لاگ SQL Server در عکس زیر ببینید که فرآیند Zeroing فقط برای لاگ دیتابیس انجام شده است. همچنین تاثیر حذف این مجوز پس از reboot اعمال می شود. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم.
مهدی ربانی ذبیحی
عالی و ارزش این مقاله بیشتر شده بابت منابعی که در پایانش قرار گرفته.با تشکر
تورج عزیزی
فعال شدن با Restart سرویس SQL است و غیر فعال شدن نیاز به reboot ویندوز دارد.
sdfdsfsdfsdf
سلام
Hamid J. Fard
یعنی SQL Server فقط بعد از Restart شدن می تواند از این قابلیت استفاده کند.
تورج عزیزی
مهندس منظور من این بود که با دو trace flag می تونید در لاگ SQL فرآیند Zeroing رو ببینید.
Hamid J. Fard
عذر می خوام.
Hamid J. Fard
تریس فلگ ۳۶۰۵ و ۳۰۰۴ فقط برای نشان دادن پیغام در فایل لاگ است نه اینکه این قابلیت رو فعال سازی کند.
محسن محمدی
سلام
مسعود طاهری
یکی از کارهای جالب استفاده از دستور DBCC WritePage است. این دستور جزء دستورات Undocumented می باشد.
Hamid J. Fard
🙂
مسعود طاهری
مسعود طاهری
مسعود طاهری
یکی از کارهای جالب استفاده از دستور DBCC WritePage است. این دستور جزء دستورات Undocumented می باشد.