Baru-baru ini, Erin Stellato (@erinstellato) membuat blog tentang dampak kinerja Inisialisasi File Instan (IFI) saat membuat atau memulihkan basis data. Dia menjelaskan bahwa penyiapan SQL Server 2016 sekarang menawarkan Anda kemampuan untuk memberikan hak yang sesuai ke layanan SQL Server selama penginstalan (kami juga membicarakan hal ini di bagian CTP 3.0 pada Build Terbaru SQL Server 2016):
Sekarang Anda dapat mengaktifkan Inisialisasi File Instan selama penyiapan SQL Server
Kuncinya adalah opsi baru (yang juga dapat Anda tentukan dalam file konfigurasi):
SQLSVCINSTANTFILEINIT="Benar|Salah"Sangat menyenangkan bahwa Anda benar-benar dapat mengurangi jumlah waktu yang diperlukan untuk membuat atau memulihkan basis data nanti, tanpa harus ingat untuk masuk ke gpedit, menetapkan hak dengan benar, dan memulai ulang layanan. Tetapi manfaat yang jauh lebih besar bagi saya adalah kemampuan untuk mengonfigurasi file tempdb yang lebih besar selama penyiapan, memanfaatkan IFI lebih awal.
Sekarang, ada beberapa batasan selama penyiapan; misalnya, jumlah file tempdb dibatasi hingga 8 (atau jumlah core, mana yang lebih kecil), dan ukuran setiap file hanya dapat mencapai maksimal 1.024 MB. Batasan ini diberlakukan di UI, dan saya pikir saya mungkin bisa menyiasatinya dengan menentukan ukuran yang lebih tinggi dalam file konfigurasi untuk pemasangan tanpa pengawasan, tetapi itu juga tidak berhasil. (Log mengatakan:"Nilai 8192 untuk ukuran file TempDB melebihi 1024 MB dan mungkin berdampak pada waktu penginstalan. Anda dapat mengaturnya ke ukuran yang lebih kecil dan mengubahnya setelah penginstalan.") Secara pribadi, saya pikir di hari ini dan usia, dengan kecepatan dan ukuran penyimpanan yang bisa kita peroleh, batas 1 GB pada ukuran file data secara artifisial rendah. Jadi saya mengajukan saran Connect:
- Hubungkan #2457759 :file data tempdb tidak boleh dibatasi hingga 1024 MB
Dan kemudian ditunjukkan bahwa Brent Ozar (@BrentO) mengajukan item serupa sebelumnya dalam siklus CTP, ketika batas sebenarnya diberlakukan sebagai 256 MB, bukan 1 GB:
- Hubungkan #1841076 :Ukuran awal penyiapan TempDB terlalu rendah
Saya tidak memiliki mesin monster yang dapat mendukung file 64 x 1 GB, dan itu juga bukan pengujian yang realistis, jadi saya memutuskan untuk menguji dampak IFI pada 8 file data tempdb masing-masing 1 GB. Saya agak sekolah tua, jadi saya membuat empat file .ini yang berbeda, dan saya telah menyoroti baris yang akan saya ubah untuk setiap tes (saya ingin membuat dasar instalasi minimal dengan file data 4 x 8 MB, menggunakan IFI dan tidak, lalu bandingkan dengan file 8 x 1.024 MB). Karena saya akan menjalankan loop ini beberapa kali, penting untuk menggunakan nama instance yang berbeda tergantung pada apakah IFI diaktifkan atau tidak, karena setelah Anda memberikan hak ke akun layanan, itu tidak akan hilang hanya dengan menghapus instance (dan saya dapat mengatur akun tersebut secara mandiri, tetapi saya ingin membuat pengujian ini mudah untuk direproduksi).
;File Konfigurasi SQL Server 2016 RC0[OPSI]
ACTION="Instal"
ENU="Benar"
QUIET="Benar"
QUIETSIMPLE="Salah"
UpdateEnabled="Salah"
ERRORREPORTING="Salah"
USEMICROSOFTUPDATE="Salah"
FEATURES=SQLENGINE
HELP="Salah"
INDICATEPROGRESS=" Salah"
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"
INSTANCENAME="ABTESTIFI_ON"
INSTANCEID="ABTESTIFI_ON"
SQLTELSVCSTARTUPTYPE="Disabled"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
AGTSVCACCOUNT="NT Authority\System"
AGTSVCSTARTUPTYPE ="Manual"
SQLSVCSTARTUPTYPE="Manual"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="NT Service\MSSQL$ABTESTIFI_ON"
;Benar untuk IFI =ON, Salah untuk OFF :
SQLSVCINSTANTFILEINIT="False"
SQLSYSADMINACCOUNTS="NT Authority\System"
SQLTEMPDBFILECOUNT="8"
;1024 untuk total 8 GB, 8 untuk total 64 MB:
SQLTEMPD BFILESIZE="1024"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
BROWSERSVCSTARTUPTYPE="Manual"
Dan ini adalah file batch yang saya gunakan (ditempatkan di folder yang sama dengan file konfigurasi), yang menginstal dan kemudian menghapus instance menggunakan setiap kombinasi tiga kali, dan mencatat waktu setup ke file teks – mengabaikan uninstall dan pembersihan.
echo Tes awal…@echo mati 2>nul
setlocal enabledelayedexpansion
set outputfile=time.txt
echo.> %outputfile%
rem Hapus Delapan dan/atau Enam Belas jika Anda hanya memiliki 4 core!
UNTUK %%e IN (Baseline Four Eight Sixteen) DO (
FOR %%x IN (IFI_ON IFI_OFF) LAKUKAN (
UNTUK /L %%A IN (1,1,3) LAKUKAN (
echo INSERT #x VALUES('%%e', '%%x', '!TIME! ',>> %outputfile%
D:\setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ConfigurationFile=%%e_%%x.ini
echo '!TIME!' ^)>> %outputfile%
D:\setup.exe /Q /ACTION=UNINSTALL /INSTANCENAME=ABTEST%%x /FEATURES=SQL
rem del /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST %%x\*.*"
rem rd /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST%%x\"
)
)
)
@echo on
echo …tes selesai.
Beberapa catatan:
- Anda mungkin perlu mengubah dua baris dari
D:\setup.exe
ke jalur ke direktori penyiapan. - Anda mungkin perlu memulai ulang sistem Anda sebelum menjalankan ini.
- Anda sebaiknya menjalankan file batch dari command prompt yang ditinggikan sehingga UAC tidak mengganggu Anda di setiap iterasi.
Saya menjalankan pengujian pada tiga sistem yang berbeda:
- VM Windows 10 dengan 4 core dan penyimpanan SSD
Uji dasar 4 x 8 MB dan kemudian 4 x 1.024 MB - VM Windows 10 dengan 8 core dan penyimpanan PCIe
Uji dasar 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB - VM Windows 2012 R2 dengan 16 core dan array RAID 10 saluran ganda dari 8 drive SAS 10K
Uji dasar 4 x 8 MB, 4 x 1.024 MB, 8 x 1.024 MB, dan 16 x 1.024 MB
File keluaran menghasilkan banyak pernyataan penyisipan yang dapat saya tempel di sini:
CREATE TABLE #x ( [server] varchar(32), [test] varchar(32), [start] time(2), [end] time(2) ); -- inserts pasted here SELECT [server],[test],AVG(DATEDIFF(SECOND,[start],[end])*1.0) FROM #x GROUP BY [server],[test];
Berikut adalah pengaturan waktu di masing-masing sepuluh tes, dirata-rata dan dibulatkan (klik untuk memperbesar):
Bisa ditebak, IFI menjadi penting dengan file yang lebih besar pada drive yang lebih lambat
Penyiapan membutuhkan waktu lebih dari satu menit (betapa menyenangkannya menjalankan penyiapan tanpa Alat Manajemen). Satu-satunya penyimpangan, sungguh, adalah ketika ukuran file mulai menjadi lebih besar pada drive mekanis dan dengan inisialisasi file instan dinonaktifkan. Saya tidak bisa berpura-pura terkejut dengan ini.
Kesimpulan
Jika Anda menggunakan SSD atau PCIe, inisialisasi file instan tidak dapat memperburuk keadaan, tetapi tidak ada manfaat yang jelas selama penyiapan, selama batasan ukuran file kuno untuk file data tempdb tetap utuh. Dengan aturan saat ini, tampaknya tidak mungkin untuk menguji dampak ini di luar (1 GB x jumlah inti yang tersedia). Namun, jika Anda menggunakan drive mekanis yang lambat, ada perbedaan yang mencolok, bahkan ketika hanya menginisialisasi data 8 GB atau 16 GB – bahwa menghilangkannya agak mahal ketika kepala disk harus dipindahkan. Yang mengatakan, apakah penyiapan membutuhkan waktu 75 detik atau 2 menit cukup tidak penting dalam skema besar (kecuali Anda menginstal ratusan server, tetapi tidak mengotomatiskannya karena alasan tertentu), jadi saya pikir keuntungan yang lebih besar di sini adalah kenyamanan – bukan harus ingat untuk memberikan akun layanan hak volume yang diperlukan beberapa saat setelah instalasi berhasil. Jika Anda memikirkannya, opsi konfigurasi baru ini sebenarnya dapat memberikan hasil yang jauh lebih baik dalam penginstalan otomatis sejumlah besar server, di luar waktu yang disimpan selama penginstalan sebenarnya.
- Unduh file konfigurasi dan file batch
(Pengujian saya berikutnya akan melihat waktu yang diperlukan untuk memperluas file tempdb yang ada ke ukuran yang jauh lebih besar dari 1.024 MB setelah instalasi .)