Instant File Initialization ใน SQL Server คืออะไร

บทความนี้เกิดจากผู้เขียนทดลองติดตั้ง Microsoft SQL Server 2016 CTP 3.0
และพบกับ Checkbox หนึ่งใน Wizard ของการติดตั้ง ซึ่ง Checkbox ที่ไม่เคยปรากฎมาก่อนเลยใน Version ก่อนหน้า

โดย Checkbox นี้เป็นการกำหนดสิทธิ “Perform volume maintenance tasks” แก่ Service Account ของ Database Engine
เพื่อให้มีคุณสมบัติที่เรียกว่า Instant File Initialization
Database Instant File Initialization มีใช้งานมาตั้งแต่ SQL Server 2005 แล้ว แต่อาจไม่เป็นที่รู้กัน
เพราะการตั้งค่าไม่ได้ทำในตัว SQL Server เองแต่เป็นคุณสมบัติที่ได้รับมาจาก Microsoft Windows
โดยปกติแล้วเวลาที่เราสร้าง Data File และ Transaction Log File ของฐานข้อมูลใดๆ
ลงบนดิสก์ด้วยการเขียนทับลงบนพื้นที่ที่เคยมีไฟล์ที่ลบไปแล้วอยู่ก่อนหน้า
(ซึ่งปกติการลบไฟล์ของระบบปฏิบัติการจะเป็นเพียงนำการจัดสรรพื้นที่ออกไป
แต่ไม่มีการลบข้อมูลที่ค้างอยู่บนพื้นที่ทิ้งไป ไฟล์ใหม่ที่มาใช้พื้นที่ก็เพียงเขียนทับลงไปเท่านั้น)
ปกติ SQL Server จะเขียนศูนย์ลงบนพื้นที่ที่ต้องการใช้ทั้งหมด
แต่หากต้องการความรวดเร็วในการใช้พื้นที่จัดเก็บก็สามารถตั้งค่า Database Instant File Initialization
เพื่อเวลาสร้าง Data File และ Transaction Log File จะเป็นเพียงการจัดสรรพื้นที่ใช้งาน
แต่ไม่เขียน 0 ลงไปทับข้อมูลเดิมในพื้นที่จัดสรร
เมื่อเรามีข้อมูลใหม่เพิ่มเข้ามาก็จะเขียนทับพื้นที่ส่วนนั้นเองภายหลัง
ซึ่งการทำเช่นนี้ความเร็วในการสร้างไฟล์ก็จะเพิ่มขึ้นอย่างมาก
หลังจากที่ตั้งให้มีคุณสมบัติ Database Instant File Initialization แล้ว จะเพิ่มความเร็วในกรณี
- ขณะสร้างฐานข้อมูล
- การเพิ่ม Data Files หรือ Log Files ในฐานข้อมูลที่มีอยู่แล้ว
- การเพิ่มขนาดของไฟล์ที่มีอยู่แล้ว (รวมถึงขณะเกิด Auto Growth ถ้ามีการตั้งค่าไว้ด้วย)
- ขณะทำการ Restore ฐานข้อมูลทั้งฐานข้อมูล หรือ Restore บาง FileGroup
กรณีที่ใช้ SQL Server เวอร์ชั่นก่อนหน้า SQL Server 2016
และต้องการเปิดใช้คุณสมบัติ Database Instant File Initialization
จะต้องเรียก Local Security Policy ขึ้นมา
จากนั้นไปที่ Security Settings > User Rights Assignment
เพื่อกำหนดสิทธิให้ Service Account ของ Database Engine
ได้รับสิทธิ Perform volume maintenance tasks ดังรูป

หาก SQL Server เป็น Member Server ภายใน Domain และมี SQL Server จำนวนมาก
อาจพิจารณาสร้าง Organization Unit สำหรับ SQL Server โดยเฉพาะ
และกำหนด User Rights Assignment ผ่าน Group Policy
ผู้เขียนได้ทดลองสร้างฐานข้อมูลโดยขนาดของ Data File เท่ากับ 30 GB
และขนาดของ Transaction Log File เท่ากับ 10GB
โดยยังไม่ได้ตั้งค่าให้มีคุณสมบัติ Database Instant File Initialization
ผลการทดสอบเป็นดังนี้

การสร้างไฟล์ทั้งสองใช้เวลาทั้งสิ้น 109,333 milliseconds
หรือเท่ากับ 1 นาที 49 วินาที
หลังจากนั้นผู้เขียนได้ทำการลบฐานข้อมูลทดสอบทิ้ง
และตั้งค่าให้มีคุณสมบัติ Database Instant File Initialization
ผลของการทดสอบเป็นดังนี้

การสร้างไฟล์ทั้งสองใช้เวลาเพียง 29,517 milliseconds หรือเพียง 29 วินาที เท่านั้นเอง
จะเห็นว่าเมื่อเปิดใช้คุณสมบัติ Database Instant File Initialization
ทำให้ความเร็วในการสร้างไฟล์เพิ่มขึ้นถึงเกือบ 4 เท่าตัวทีเดียว
แต่ข้อเสียด้านความปลอดภัยที่สำคัญก็คืออาจเป็นการเปิดเผยข้อมูลหลังไฟล์ถูกลบสู่บุคคลไม่พึงประสงค์
โดยบุคคลไม่พึงประสงค์เหล่านี้อาจ Dump เนื้อหาจากดิสก์ออกไปหา Sensitive Information ได้
แต่ถึงกระนั้นก็ไม่ได้ทำได้โดยง่ายหากมีการป้องกัน Physical Security ดีพอไม่ให้บุคคลไม่พึงประสงค์เข้าถึงเครื่องได้
อีกทั้งยังมีการตั้ง DACL (Discretionary Access Control) ที่เหมาะสมก็จะเป็นการป้องกันได้
อย่างไรลองพิจารณาดูครับ จากข้อมูลข้างต้น
เราจะเลือกเปิดใช้คุณสมบัติ Database Instant File Initialization กันดีหรือไม่
บทความโดย
อาจารย์ภัคพงศ์ กฤตวัฒน์
วิทยากรดูแลและออกแบบหลักสูตร
กลุ่มวิชา SQL Server/Window Server