Panduan untuk fitur performa SQL Server di Linux
Berlaku untuk: SQL Server - Linux
Jika Anda adalah pengguna Linux yang baru menggunakan SQL Server, tugas berikut memanjakan Anda melalui beberapa fitur performa. Ini tidak unik atau khusus untuk Linux, tetapi membantu memberi Anda gambaran tentang area untuk menyelidiki lebih lanjut. Dalam setiap contoh, tautan disediakan untuk dokumentasi kedalaman untuk area tersebut.
Catatan
Contoh berikut menggunakan AdventureWorks2022
database sampel. Untuk instruksi tentang cara mendapatkan dan menginstal database sampel ini, lihat Memulihkan database SQL Server dari Windows ke Linux.
Membuat indeks penyimpan kolom
Indeks penyimpan kolom adalah teknologi untuk menyimpan dan mengkueri penyimpanan data besar dalam format data kolom, yang disebut penyimpan kolom.
Tambahkan indeks penyimpan kolom ke
SalesOrderDetail
tabel dengan menjalankan perintah Transact-SQL berikut:CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore] ON Sales.SalesOrderDetail (UnitPrice, OrderQty, ProductID); GO
Jalankan kueri berikut yang menggunakan indeks penyimpan kolom untuk memindai tabel:
SELECT ProductID, SUM(UnitPrice) SumUnitPrice, AVG(UnitPrice) AvgUnitPrice, SUM(OrderQty) SumOrderQty, AVG(OrderQty) AvgOrderQty FROM Sales.SalesOrderDetail GROUP BY ProductID ORDER BY ProductID;
Verifikasi bahwa indeks penyimpan kolom digunakan dengan mencari
object_id
indeks penyimpan kolom dan mengonfirmasi bahwa indeks tersebut muncul dalam statistik penggunaan untukSalesOrderDetail
tabel:SELECT * FROM sys.indexes WHERE name = 'IX_SalesOrderDetail_ColumnStore' GO SELECT * FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID('AdventureWorks2022') AND object_id = OBJECT_ID('AdventureWorks2022.Sales.SalesOrderDetail');
Gunakan OLTP Dalam Memori
SQL Server menyediakan fitur OLTP Dalam Memori yang dapat sangat meningkatkan performa sistem aplikasi. Bagian ini memandu Anda melalui langkah-langkah untuk membuat tabel yang dioptimalkan memori yang disimpan dalam memori dan prosedur tersimpan yang dikompilasi secara asli yang dapat mengakses tabel tanpa perlu dikompilasi atau ditafsirkan.
Mengonfigurasi Database untuk OLTP Dalam Memori
Disarankan untuk mengatur database ke tingkat kompatibilitas setidaknya 130 untuk menggunakan OLTP Dalam Memori. Gunakan kueri berikut untuk memeriksa tingkat kompatibilitas saat ini dari
AdventureWorks2022
:USE AdventureWorks2022; GO SELECT d.compatibility_level FROM sys.databases as d WHERE d.name = DB_NAME(); GO
Jika perlu, perbarui tingkat ke 130:
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130; GO
Ketika transaksi melibatkan tabel berbasis disk dan tabel yang dioptimalkan memori, sangat penting bahwa bagian transaksi yang dioptimalkan memori beroperasi pada tingkat isolasi transaksi bernama SNAPSHOT. Untuk menerapkan tingkat ini dengan andal untuk tabel yang dioptimalkan memori dalam transaksi lintas kontainer, jalankan hal berikut:
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON; GO
Sebelum dapat membuat tabel yang dioptimalkan memori, Anda harus terlebih dahulu membuat grup file memori yang dioptimalkan, dan kontainer untuk file data:
ALTER DATABASE AdventureWorks2022 ADD FILEGROUP AdventureWorks_mod CONTAINS memory_optimized_data; GO ALTER DATABASE AdventureWorks2022 ADD FILE (NAME='AdventureWorks_mod', FILENAME='/var/opt/mssql/data/AdventureWorks_mod') TO FILEGROUP AdventureWorks_mod; GO
Membuat tabel memori yang dioptimalkan
Penyimpanan utama untuk tabel yang dioptimalkan memori adalah memori utama dan tidak seperti tabel berbasis disk, data tidak perlu dibaca dari disk ke dalam buffer memori. Untuk membuat tabel yang dioptimalkan memori, gunakan klausa MEMORY_OPTIMIZED = ON.
Jalankan kueri berikut untuk membuat dbo tabel yang dioptimalkan memori. BelanjaCart. Sebagai default, data disimpan pada disk untuk tujuan durabilitas (DURABILITY juga dapat diatur untuk mempertahankan skema saja).
CREATE TABLE dbo.ShoppingCart ( ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED, UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), CreatedDate DATETIME2 NOT NULL, TotalPrice MONEY ) WITH (MEMORY_OPTIMIZED=ON); GO
Sisipkan beberapa rekaman ke dalam tabel:
INSERT dbo.ShoppingCart VALUES (8798, SYSDATETIME(), NULL); INSERT dbo.ShoppingCart VALUES (23, SYSDATETIME(), 45.4); INSERT dbo.ShoppingCart VALUES (80, SYSDATETIME(), NULL); INSERT dbo.ShoppingCart VALUES (342, SYSDATETIME(), 65.4);
Prosedur tersimpan yang dikompilasi secara asli
SQL Server mendukung prosedur tersimpan yang dikompilasi secara asli yang mengakses tabel yang dioptimalkan memori. Pernyataan T-SQL dikompilasi ke kode mesin dan disimpan sebagai DLL asli, memungkinkan akses data yang lebih cepat dan eksekusi kueri yang lebih efisien daripada T-SQL tradisional. Prosedur tersimpan yang ditandai dengan NATIVE_COMPILATION dikompilasi secara asli.
Jalankan skrip berikut untuk membuat prosedur tersimpan yang dikompilasi secara asli yang menyisipkan sejumlah besar rekaman ke dalam tabel ShoppingCart:
CREATE PROCEDURE dbo.usp_InsertSampleCarts @InsertCount INT WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') DECLARE @i INT = 0 WHILE @i < @InsertCount BEGIN INSERT INTO dbo.ShoppingCart VALUES (1, SYSDATETIME(), NULL) SET @i += 1 END END
Sisipkan 1.000.000 baris:
EXEC usp_InsertSampleCarts 1000000;
Verifikasi bahwa baris telah disisipkan:
SELECT COUNT(*) FROM dbo.ShoppingCart;
Menggunakan Penyimpanan Kueri
Penyimpanan Kueri mengumpulkan informasi performa terperinci tentang kueri, rencana eksekusi, dan statistik runtime.
Sebelum SQL Server 2022 (16.x), Penyimpanan Kueri tidak diaktifkan secara default, dan dapat diaktifkan dengan ALTER DATABASE:
ALTER DATABASE AdventureWorks2022 SET QUERY_STORE = ON;
Jalankan kueri berikut untuk mengembalikan informasi tentang kueri dan paket di penyimpanan kueri:
SELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*
FROM sys.query_store_plan AS Pl
JOIN sys.query_store_query AS Qry
ON Pl.query_id = Qry.query_id
JOIN sys.query_store_query_text AS Txt
ON Qry.query_text_id = Txt.query_text_id;
Tampilan manajemen dinamis kueri
Tampilan manajemen dinamis mengembalikan informasi status server yang dapat digunakan untuk memantau kesehatan instans server, mendiagnosis masalah, dan menyetel performa.
Untuk mengkueri tampilan manajemen dinamis statistik dm_os_wait:
SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats;
Lihat juga
- Mulai Cepat 1: Teknologi OLTP Dalam Memori untuk Performa Transact-SQL yang Lebih Cepat
- Migrasi ke OLTP Dalam Memori
- Tabel sementara dan variabel tabel yang lebih cepat dengan menggunakan pengoptimalan memori
- Memantau dan Memecahkan Masalah Penggunaan Memori
- In-Memory OLTP (Pengoptimalan In-Memory)