خانه SQL Server Instant File Initialization در SQL Server SQL Server افزایش سرعت SQL Server نوشته شده توسط: تورج عزیزی تاریخ انتشار: ۲۷ مهر ۱۳۹۴ آخرین بروزرسانی: ۱۰ اردیبهشت ۱۴۰۱ زمان مطالعه: 16 دقیقه ۲.۳ (۳) سلام دوستان عزیز در این مقاله قصد دارم شما رو با مفهوم Instant Initialization و تاثیر اون بر Performance آشنا کنم. فایل های دیتا و لاگ هنگام انجام هر یک از اعمال زیر آماده سازی اولیه (File Initialization) می شوند تا داده هایی که از فایل های پاک شده روی دیسک باقی مانده با مقدار صفر رونویسی شوند: ایجاد دیتابیس اضافه کردن فایل داده یا لاگ به دیتابیس افزایش اندازه یک فایل موجود (شامل عملیات autogrowth هم می شود) restore یک دیتابیس یا Filegroup File Initialization باعث می شود تا انجام این عملیات طولانی تر شود. SQL Server می تواند از این فرآیند صرفنظر کند و بدون رونویسی فضای تخصیص داده شده با صفر، فوراً آن را تخصیص دهد. کلمه Instant به معنی “فوری” است. Instant Initialization قابلیتی است که در SQL Server 2005 ارائه شد. Instant Initialization بر اساس قابلیتی است که به NTFS در ویندوز XP اضافه شد و به تبع آن در Windows Server 2003 هم قابل استفاده است Instant Initialization به ما اجازه میدهد تا SQL Server درخواست تخصیص فضای ذخیره سازی از فرآیند پر کردن فضای تخصیص داده شده با صفر صرف نظر کند. به این فرآیند Zero Initialization گفته می شود. بنابراین فارغ از اندازه فضای تخصیص داده شده در فایل داده ای فرآیند تخصیص می تواند به سرعت و فوری انجام شود. SQL Server فرآیند نادیده گرفتن Zero Initialization را تنها می تواند در مورد DATA File ها اعمال کند. Zero Initialization در مورد transaction log اجباری است چون طبیعت این فایل چرخشی است یعنی پس از رسیدن به انتهای فایل SQL Server دوباره از ابتدای فایل شروع به رونویسی روی لاگ های قدیمی می کند (به این عمل Warp-around هم گفته می شود) و علت اجباری بودن هم مربوط به روند اجرای recovery است که فایل لاگ را می خواند و با رسیدن به مقدار صفر به این فرآیند خاتمه می دهد (این موضوع را در یک مقاله دیگر پوشش می دهم). برای فعال کردن قابلیت Instant Initialization باید به اکانت سرویس SQL Server مجوز “Perform Volume Maintenance Tasks” داده شود. برای اینکار باید به این شکل عمل کنید: ۱- در Command prompt دستور secpol.msc را وارد کنید تا این پنجره ظاهر شود و سپس مسیر Local Policies > User Rights Assignment را دنبال کنید: ۲- روی گزینه Perform Volume Maintenance Tasks راست کلیک کنید و Properties را انتخاب کنید تا این کادر ظاهر شود: ۳- روی Add User Group کلیک کنید و سپس در این کادر سرویسی که SQL Server با آن در حال اجراست را وارد کنید: ۴- سرویس SQL Server را Restart کنید. برای پیدا کردن اکانت سرویس SQL Server می توانید از اسکریپت زیر استفاده کنید: DECLARE @DBEngineLogin VARCHAR(100) EXECUTE master.dbo.xp_instance_regread @rootkey = N'HKEY_LOCAL_MACHINE', @key = N'SYSTEM\CurrentControlSet\Services\MSSQLServer', @value_name = N'ObjectName', @value = @DBEngineLogin OUTPUT SELECT [DBEngineLogin] = @DBEngineLogin برای تست تاثیر فعال کردن می توانید این اسکریپت را قبل و بعد از فعال کردن اجرا کنید: CREATE DATABASE TestDatabase ON PRIMARY ( NAME = N'TestDatabase', FILENAME = N'G:\SQL\DATA\TestDatabase.mdf' , SIZE = 51200000KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TestDatabase_log', FILENAME = N'G:\SQL\Log\TestDatabase_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10% ) GO برای ساخت دیتابیس بالا SQL Server باید ۵۰ GB مقدار ۰ را روی دیسک بنویسد! و البته این کار با فراخوانی یک تابع API ویندوز به نام SetFileValidData انجام می شود. در تصویر زیر که لاگ SQL است میتوانید از یک نمونه فرآیند ساخت دیتابیس تا قبل از دادن مجوز Perform Volume Maintenance Tasks به اکانت SQL Server را مشاهده می کنید و همانطور که می بینید پر کردن با صفر هم برای فایل داده ای و هم لاگ انجام شده است: پس از دادن مجوز Perform Volume Maintenance Tasks و فعال کردن دو trace flag با شماره های ۳۰۰۴ و ۳۶۰۵ (با دستور DBCC TRACEON(۳۶۰۵)) و اجرای مجدد اسکریپت ساخت دیتابیس می توانید در لاگ SQL Server در عکس زیر ببینید که فرآیند Zeroing فقط برای لاگ دیتابیس انجام شده است: و نکته آخر اینکه تاثیر حذف این مجوز پس از reboot اعمال می شود. منابع http://www.sqlskills.com/blogs/kimberly/instant-initialization-what-why-and-how/ http://www.sqlpassion.at/archive/2014/02/18/improving-sql-server-performance-by-using-instant-file-initialization/ http://www.sqlfingers.com/2014/07/should-you-enable-instant-file.html چه رتبه ای میدهید؟ میانگین ۲.۳ / ۵. از مجموع ۳ اولین نفر باش معرفی نویسنده مقالات 18 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تورج عزیزی معرفی محصول مسعود طاهری آموزش ۳ در ۱ Performance Tuning در SQL Server 6.700.000 تومان 5.700.000 تومان مقالات مرتبط ۰۸ شهریور SQL Server اهمیت مانیتورینگ در SQL Server چیست؟ | تمام آنچه که باید از مانیتورینگ بدانید تیم فنی نیک آموز ۰۳ شهریور SQL Server اعمال گواهینامه SSL روی SQL Server تیم فنی نیک آموز ۳۱ مرداد SQL Server دستور Rank در SQL Server ؛ کلید حل معمای رتبه بندی تیم فنی نیک آموز ۲۵ مرداد SQL Server نرم افزار (Microsoft SQL Server Management Studio (SSMS چیست؟ تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ مهدی ربانی ذبیحی ۰۱ / ۱۱ / ۹۴ - ۰۶:۵۱ عالی و ارزش این مقاله بیشتر شده بابت منابعی که در پایانش قرار گرفته.با تشکر پاسخ به دیدگاه تورج عزیزی ۲۹ / ۰۷ / ۹۴ - ۱۰:۰۴ فعال شدن با Restart سرویس SQL است و غیر فعال شدن نیاز به reboot ویندوز دارد. پاسخ به دیدگاه sdfdsfsdfsdf ۲۹ / ۰۷ / ۹۴ - ۰۹:۴۸ سلام تشکر از مقاله خوبی که در مورد Performance به اشتراک گذاشتید. میشه بگید منظورتون از ((نکته آخر اینکه تاثیر حذف این مجوز پس از reboot اعمال می شود)) دقیقاً چی هستش؟ پاسخ به دیدگاه Hamid J. Fard ۲۹ / ۰۷ / ۹۴ - ۰۹:۲۶ یعنی SQL Server فقط بعد از Restart شدن می تواند از این قابلیت استفاده کند. پاسخ به دیدگاه تورج عزیزی ۲۸ / ۰۷ / ۹۴ - ۱۰:۳۶ مهندس منظور من این بود که با دو trace flag می تونید در لاگ SQL فرآیند Zeroing رو ببینید. پاسخ به دیدگاه Hamid J. Fard ۲۸ / ۰۷ / ۹۴ - ۰۴:۱۶ عذر می خوام. ۱ پاسخ به دیدگاه Hamid J. Fard ۲۸ / ۰۷ / ۹۴ - ۰۸:۳۸ تریس فلگ ۳۶۰۵ و ۳۰۰۴ فقط برای نشان دادن پیغام در فایل لاگ است نه اینکه این قابلیت رو فعال سازی کند. نکته دیگر اینکه شما اگر این قابلیت رو فعال سازی کنید می توانید داده های یک پایگاه داده حذف شده از دیسک را بخوانید به این صورت که ۱- پایگاه داده ساخته و از داده انبوه کنید. ۲- پایگاه داده را حذف کرده. ۳- یک پایگاه داده جدید با همان نام – آدرس فیزیکی و حجم بسازید ۴- با دستورات DBCC PAGE می توانید داده های قبلی را بازیابی کنید. ۵- خیلی حرفه ای تر – شما می توانید Data Page را به IAM نسبت داده و داده را با دستور Select بازیابی کنید. مقاله خوبی بود. پاسخ به دیدگاه محسن محمدی ۲۸ / ۰۷ / ۹۴ - ۱۰:۳۸ سلام آیا امکان وجود دارد برای موارد ۴و ۵ لینک توضیحی بگذارید بسیار ممنون پاسخ به دیدگاه مسعود طاهری ۰۲ / ۰۸ / ۹۴ - ۰۸:۵۳ سلام یکی از کارهای جالب استفاده از دستور DBCC WritePage است. این دستور جزء دستورات Undocumented می باشد. مثال های خوبی به ازای این دستور در لینک زیر وجود دارد. http://www.sqlnotes.info/2011/11/23/dbcc-writepage/ ضمنا لینک های زیر کمک مفیدی به شما می تواند بکند. http://www.sqlnotes.info/2013/05/14/protect-yourself-from-using-dbcc-writepage/ http://www.sqlnotes.info/2013/05/02/fix-page-checksum/ http://www.sqlnotes.info/2013/04/30/sql-server-0-and-0/ http://www.sqlnotes.info/2011/10/31/page-type/ پاسخ به دیدگاه Hamid J. Fard ۲۸ / ۰۷ / ۹۴ - ۰۴:۱۵ 🙂 لینک توضیحی که در حال حاضر موجود نیست. این تکنیکنهایی است که گروه های CAT و CSS در شرکت مایکروسافت برای بازیابی داده های از بین رفته بدون فایل پشتیبان استفاده می کنند. متاسفم اینها جزء اسرار است البته مورد ۵ خیلی محرمانه تر است. پاسخ به دیدگاه مسعود طاهری ۲۷ / ۰۷ / ۹۴ - ۱۱:۲۵ سلام خیلی عالی یک نکته کوچک این که هنگامیکه این قابلیت فعال می شود بخش تخصیص نیافته دیتا فایل می تواند شامل اطلاعات فایل های سیستم عامل باشد که قبلا حذف شده است. می توان آزمایشی مشابه لینک زیر را انجام دهید http://www.sqlpassion.at/archive/2014/02/18/improving-sql-server-performance-by-using-instant-file-initialization/ البته این موضوع هیچ ایرادی به این قابلیت ندارد. ممنون از تورج عزیز پاسخ به دیدگاه مسعود طاهری ۲۷ / ۰۷ / ۹۴ - ۱۱:۲۵ سلام خیلی عالی یک نکته کوچک این که هنگامیکه این قابلیت فعال می شود بخش تخصیص نیافته دیتا فایل می تواند شامل اطلاعات فایل های سیستم عامل باشد که قبلا حذف شده است. می توان آزمایشی مشابه لینک زیر را انجام دهید http://www.sqlpassion.at/archive/2014/02/18/improving-sql-server-performance-by-using-instant-file-initialization/ البته این موضوع هیچ ایرادی به این قابلیت ندارد. ممنون از تورج عزیز پاسخ به دیدگاه مسعود طاهری ۰۲ / ۰۸ / ۹۴ - ۰۸:۵۳ سلام یکی از کارهای جالب استفاده از دستور DBCC WritePage است. این دستور جزء دستورات Undocumented می باشد. مثال های خوبی به ازای این دستور در لینک زیر وجود دارد. http://www.sqlnotes.info/2011/11/23/dbcc-writepage/ ضمنا لینک های زیر کمک مفیدی به شما می تواند بکند. http://www.sqlnotes.info/2013/05/14/protect-yourself-from-using-dbcc-writepage/ http://www.sqlnotes.info/2013/05/02/fix-page-checksum/ http://www.sqlnotes.info/2013/04/30/sql-server-0-and-0/ http://www.sqlnotes.info/2011/10/31/page-type/ پاسخ به دیدگاه