Sejak rilis SQL Server 2017 untuk Linux, Microsoft telah cukup banyak mengubah keseluruhan permainan. Ini memungkinkan kemungkinan dunia baru untuk database relasional mereka yang terkenal, menawarkan apa yang hanya tersedia di ruang Windows sampai saat itu.
Saya tahu bahwa DBA murni akan langsung memberi tahu saya bahwa SQL Server 2019 versi Linux memiliki beberapa perbedaan, dalam hal fitur, sehubungan dengan mitra Windows-nya, seperti:
- Tidak ada Agen Server SQL
- Tidak Ada FileStream
- Tidak Ada Prosedur Tersimpan Sistem yang Diperpanjang (mis. xp_cmdshell)
Namun, saya cukup penasaran untuk berpikir "bagaimana jika mereka dapat dibandingkan, setidaknya sampai batas tertentu, dengan hal-hal yang dapat dilakukan keduanya?" Jadi, saya menarik pelatuk pada beberapa VM, menyiapkan beberapa tes sederhana, dan mengumpulkan data untuk disajikan kepada Anda. Mari kita lihat bagaimana hasilnya!
Pertimbangan Awal
Berikut spesifikasi masing-masing VM:
- Windows
- OS Windows 10
- 4 vCPU
- RAM 4 GB
- SSD 30 GB
- Linux
- Server Ubuntu 20,04 LTS
- 4 vCPU
- RAM 4 GB
- SSD 30 GB
Untuk Versi SQL Server, saya memilih yang terbaru untuk kedua Sistem Operasi:SQL Server 2019 Developer Edition CU10
Di setiap penerapan, satu-satunya yang diaktifkan adalah Inisialisasi File Instan (diaktifkan secara default di Linux, diaktifkan secara manual di Windows). Selain itu, nilai default tetap untuk setelan lainnya.
- Di Windows, Anda dapat memilih untuk mengaktifkan Inisialisasi File Instan dengan wizard penginstalan.
Posting ini tidak akan membahas kekhususan pekerjaan Inisialisasi File Instan di Linux. Namun, saya akan memberikan Anda tautan ke artikel khusus yang dapat Anda baca nanti (perhatikan bahwa karena ini agak berat di sisi teknis).
Apa yang Termasuk dalam Tes?
- Dalam setiap contoh SQL Server 2019, saya menerapkan database pengujian dan membuat satu tabel dengan hanya satu bidang (NVARCHAR(MAX)).
- Menggunakan string 1.000.000 karakter yang dibuat secara acak, saya melakukan langkah-langkah berikut:
- *Masukkan X jumlah baris ke dalam tabel pengujian.
- Ukur berapa lama waktu yang dibutuhkan untuk menyelesaikan pernyataan INSERT.
- Ukur ukuran file MDF dan LDF.
- Hapus semua baris dalam tabel pengujian.
- **Ukur berapa lama waktu yang dibutuhkan untuk menyelesaikan pernyataan DELETE.
- Ukur ukuran file LDF.
- Lepaskan database pengujian.
- Buat database pengujian lagi.
- Ulangi siklus yang sama.
*X dilakukan untuk 1.000, 5.000, 10.000, 25.000, dan 50.000 baris.
**Saya tahu bahwa pernyataan TRUNCATE melakukan pekerjaan dengan lebih efisien, tetapi poin saya di sini adalah untuk membuktikan seberapa baik setiap log transaksi dikelola untuk operasi penghapusan di setiap OS.
Anda dapat melanjutkan ke situs web yang saya gunakan untuk menghasilkan string acak jika Anda ingin menggali lebih dalam.
Berikut adalah bagian dari kode TSQL yang saya gunakan untuk pengujian di setiap Sistem Operasi:
Kode TSQL Linux
Pembuatan Database dan Tabel
DROP DATABASE IF EXISTS test
CREATE DATABASE test
ON
(FILENAME= '/var/opt/mssql/data/test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= '/var/opt/mssql/data/test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);
CREATE TABLE test.dbo.ubuntu(
long_string NVARCHAR(MAX) NOT NULL
)
Ukuran file MDF dan LDF untuk database pengujian
SELECT
DB_NAME(database_id) AS 'DB',
type_desc AS 'Type',
state_desc AS 'State',
CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM sys.master_files
WHERE DB_NAME(database_id) = 'test'
Tangkapan layar di bawah ini menunjukkan ukuran file data ketika tidak ada yang disimpan dalam database:
Kueri untuk menentukan apakah Inisialisasi File Instan diaktifkan
SELECT
servicename,
instant_file_initialization_enabled
FROM sys.dm_server_services
WHERE servicename = 'SQL Server (MSSQLSERVER)'
Kode TSQL Windows
Pembuatan Database dan Tabel
DROP DATABASE IF EXISTS test
CREATE DATABASE test
ON
(FILENAME= 'S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= ''S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);
CREATE TABLE test.dbo.windows(
long_string NVARCHAR(MAX) NOT NULL
)
Ukuran file MDF dan LDF untuk database pengujian
SELECT
DB_NAME(database_id) AS 'DB',
type_desc AS 'Type',
state_desc AS 'State',
CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM sys.master_files
WHERE DB_NAME(database_id) = 'test'
Tangkapan layar berikut menunjukkan ukuran file data ketika tidak ada yang disimpan dalam database:
Kueri untuk menentukan apakah Inisialisasi File Instan diaktifkan
SELECT
servicename,
instant_file_initialization_enabled
FROM sys.dm_server_services
WHERE servicename = 'SQL Server (MSSQLSERVER)'
Script untuk melakukan pernyataan INSERT:
@limit -> di sini saya menentukan jumlah baris yang akan dimasukkan ke dalam tabel pengujian
Untuk Linux, karena saya menjalankan skrip menggunakan SQLCMD, saya meletakkan fungsi DATEDIFF di bagian paling akhir. Ini memberi tahu saya berapa detik yang dibutuhkan seluruh eksekusi (untuk varian Windows, saya bisa melihat sekilas timer di SQL Server Management Studio).
Seluruh string 1.000.000 karakter menggantikan 'XXXX'. Saya meletakkannya seperti itu hanya untuk menyajikannya dengan baik di posting ini.
SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
DECLARE @i INT;
DECLARE @limit INT;
SET @StartTime = GETDATE();
SET @i = 0;
SET @limit = 1000;
WHILE(@i < @limit)
BEGIN
INSERT INTO test.dbo.ubuntu VALUES('XXXX');
SET @i = @i + 1
END
SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';
Script untuk melakukan pernyataan DELETE
SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
SET @StartTime = GETDATE();
DELETE FROM test.dbo.ubuntu;
SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';
Hasil yang Diperoleh
Semua ukuran dinyatakan dalam MB. Semua pengukuran waktu dinyatakan dalam detik.
MASUKKAN Waktu | 1.000 catatan | 5000 catatan | 10.000 catatan | 25.000 catatan | 50.000 catatan |
Linux | 4 | 23 | 43 | 104 | 212 |
Windows | 4 | 28 | 172 | 531 | 186 |
Ukuran (MDF) | 1.000 catatan | 5000 catatan | 10.000 catatan | 25.000 catatan | 50.000 catatan |
Linux | 264 | 1032 | 2056 | 5128 | 10184 |
Windows | 264 | 1032 | 2056 | 5128 | 10248 |
Ukuran (LDF) | 1.000 catatan | 5000 catatan | 10.000 catatan | 25.000 catatan | 50.000 catatan |
Linux | 104 | 264 | 360 | 552 | 148 |
Windows | 136 | 328 | 392 | 456 | 584 |
HAPUS Waktu | 1.000 catatan | 5000 catatan | 10.000 catatan | 25.000 catatan | 50.000 catatan |
Linux | 1 | 1 | 74 | 215 | 469 |
Windows | 1 | 63 | 126 | 357 | 396 |
HAPUS Ukuran (LDF) | 1.000 catatan | 5000 catatan | 10.000 catatan | 25.000 catatan | 50.000 catatan |
Linux | 136 | 264 | 392 | 584 | 680 |
Windows | 200 | 328 | 392 | 456 | 712 |
Insight Utama
- Ukuran MDF cukup konsisten di seluruh pengujian, sedikit berbeda di bagian paling akhir (tapi tidak ada yang terlalu gila).
- Pengaturan waktu untuk INSERT sebagian besar lebih baik di Linux, kecuali di akhir saat Windows “memenangkan putaran”.
- Ukuran file log transaksi lebih baik ditangani di Linux setelah setiap putaran INSERT.
- Pengaturan waktu untuk DELETE lebih baik di Linux untuk sebagian besar, kecuali bagian paling akhir di mana Windows “memenangkan putaran” (saya merasa penasaran bahwa Windows juga memenangkan putaran INSERT terakhir).
- Ukuran file log transaksi setelah setiap putaran DELETE cukup mirip dalam hal pasang surut di antara keduanya.
- Saya ingin menguji dengan 100.000 baris, tetapi saya kekurangan ruang disk, jadi saya membatasinya pada 50.000.
Kesimpulan
Berdasarkan hasil yang diperoleh dari pengujian ini, menurut saya tidak ada alasan kuat untuk mengklaim bahwa varian Linux berkinerja lebih baik secara eksponensial daripada rekan Windows-nya. Tentu saja, ini sama sekali bukan ujian formal yang dapat Anda jadikan landasan untuk membuat keputusan seperti itu. Namun, latihan itu sendiri cukup menarik bagi saya.
Saya kira SQL Server 2019 untuk Windows terkadang tertinggal (tidak terlalu banyak) karena rendering GUI di latar belakang, yang tidak terjadi di sisi server Ubuntu.
Jika Anda sangat bergantung pada fitur dan kemampuan yang eksklusif untuk Windows (setidaknya pada saat penulisan ini), maka lakukanlah. Jika tidak, Anda tidak akan membuat pilihan yang buruk dengan memilih salah satunya.