Bagikan melalui


Panduan untuk fitur performa SQL Server di Linux

Berlaku untuk:SQL Server di 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, disediakan tautan ke dokumentasi mendalam untuk area tersebut.

Catatan

Contoh berikut menggunakan AdventureWorks2022 database sampel. Untuk instruksi tentang cara mendapatkan dan menginstal database sampel ini, lihat Memigrasikan database SQL Server dari Windows ke Linux menggunakan pencadangan dan pemulihan.

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) AS SumUnitPrice,
           AVG(UnitPrice) AS AvgUnitPrice,
           SUM(OrderQty) AS SumOrderQty,
           AVG(OrderQty) AS AvgOrderQty
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    ORDER BY ProductID;
    
  3. Verifikasi bahwa indeks columnstore digunakan dengan memeriksa object_id untuk indeks columnstore dan mengonfirmasi bahwa indeks tersebut muncul dalam statistik penggunaan untuk tabel SalesOrderDetail.

    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. Anda harus 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 tabel dbo.ShoppingCart yang dioptimalkan memori. 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 AS 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:

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. Verifikasi bahwa baris telah disisipkan:

    SELECT COUNT(*)
    FROM dbo.ShoppingCart;
    

Menggunakan Query Store

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 menampilkan informasi tentang kueri dan rencana di Penyimpanan Kueri.

SELECT Txt.query_text_id,
       Txt.query_sql_text,
       Pl.plan_id,
       Qry.*
FROM sys.query_store_plan AS Pl
     INNER JOIN sys.query_store_query AS Qry
         ON Pl.query_id = Qry.query_id
     INNER 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;