Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tes Kinerja MS SQL Server di Linux vs Windows untuk Menemukan Perbedaannya

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?

  1. Dalam setiap contoh SQL Server 2019, saya menerapkan database pengujian dan membuat satu tabel dengan hanya satu bidang (NVARCHAR(MAX)).
  2. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2017 Langkah demi Langkah Instalasi -1

  2. Menemukan Induk Tingkat Teratas di SQL

  3. Cara Membuat Script Untuk Mengaktifkan Semua Batasan Kunci Asing di Database SQL Server - Tutorial SQL Server / TSQL Bagian 78

  4. Bagaimana saya bisa mengubah database default saya di SQL Server tanpa menggunakan MS SQL Server Management Studio?

  5. SqlServer:Login gagal untuk pengguna