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.

  1. 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
    
  2. 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;
    
  3. Verifikasi bahwa indeks penyimpan kolom digunakan dengan mencari object_id indeks penyimpan kolom dan mengonfirmasi bahwa indeks tersebut muncul dalam statistik penggunaan untuk SalesOrderDetail 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

  1. 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
    
  2. 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
    
  3. 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.

  1. 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
    
  2. 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.

  1. 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
    
  2. Sisipkan 1.000.000 baris:

    EXEC usp_InsertSampleCarts 1000000;
    
  3. 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;

Baca juga