Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Inisialisasi File Instan:Dampak Selama Penyiapan

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 .)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kebenaran dan Batasan

  2. Cara Membaca dan Menafsirkan Kesalahan SQL

  3. SQL MIN() untuk Pemula

  4. Lacak Sinyal dengan Model Data Pemrosesan Sinyal

  5. Menerapkan Aturan Bidang Menggunakan Klasifikasi