Aracılığıyla paylaş


Linux üzerinde SQL Server'ın performans özellikleri için izlenecek yol

Şunlar için geçerlidir:Linux üzerinde SQL Server

SQL Server'ı yeni kullanan bir Linux kullanıcısıysanız, aşağıdaki görevler bazı performans özelliklerinde size yol gösterir. Bunlar Linux'a özgü veya benzersiz değildir, ancak size daha fazla araştırma yapmanız gereken alanlar hakkında fikir vermenize yardımcı olur. Her örnekte, bu alanın derinlik belgelerine bir bağlantı sağlanır.

Not

Aşağıdaki örneklerde AdventureWorks2022 örnek veritabanı kullanılmıştır. Bu örnek veritabanını alma ve yükleme yönergeleri için bkz. Yedekleme ve geri yüklemekullanarak SQL Server veritabanını Windows'tan Linux'a geçirme.

Columnstore dizini oluşturma

Columnstore dizini, büyük veri depolarını columnstore adı verilen sütunlu veri biçiminde depolamaya ve sorgulamaya yönelik bir teknolojidir.

  1. Aşağıdaki Transact-SQL komutlarını yürüterek SalesOrderDetail tablosuna bir columnstore dizini ekleyin:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
        ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID);
    GO
    
  2. Tabloyu taramak için columnstore dizinini kullanan aşağıdaki sorguyu yürütür:

    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. Kolon deposu dizininin kullanıldığını doğrulamak için, object_id'ı kolon deposu dizini için kontrol edin ve SalesOrderDetail tablosunun kullanım istatistiklerinde göründüğünü onaylayın.

    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');
    

In-Memory OLTP kullanma

SQL Server, uygulama sistemlerinin performansını büyük ölçüde geliştirebilecek In-Memory OLTP özellikleri sağlar. Bu bölüm, bellekte saklanan bellek için optimize edilmiş bir tablo ve tabloya derleme veya yorumlama gerektirmeden erişebilen yerel olarak derlenmiş bir saklı yordam oluşturma adımlarında size yol gösterir.

In-Memory OLTP için Veritabanı Yapılandırma

  1. In-Memory OLTP kullanmak için veritabanını en az 130 uyumluluk düzeyine ayarlamanız gerekir. AdventureWorks2022geçerli uyumluluk düzeyini denetlemek için aşağıdaki sorguyu kullanın:

    USE AdventureWorks2022;
    GO
    
    SELECT d.compatibility_level
    FROM sys.databases AS d
    WHERE d.name = DB_NAME();
    GO
    

    Gerekirse düzeyi 130 olarak güncelleştirin:

    ALTER DATABASE CURRENT
        SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. Bir işlem hem disk tabanlı bir tablo hem de bellek için iyileştirilmiş bir tablo içerdiğinde, işlemin bellek için iyileştirilmiş bölümünün SNAPSHOT adlı işlem yalıtım düzeyinde çalışması önemlidir. Kapsayıcılar arasında bir işlemde bellek için optimize edilmiş tablolar için bu düzeyi güvenilir bir şekilde uygulamak için aşağıdakileri yapabilirsiniz:

    ALTER DATABASE CURRENT
        SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
    GO
    
  3. Bellek için iyileştirilmiş bir tablo oluşturabilmeniz için önce bellek için iyileştirilmiş bir dosya grubu ve veri dosyaları için bir kapsayıcı oluşturmanız gerekir:

    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
    

Bellek için iyileştirilmiş tablo oluşturma

Bellek için iyileştirilmiş tabloların birincil deposu ana bellektir ve bu nedenle disk tabanlı tablolardan farklı olarak verilerin diskten bellek arabelleklerine okunması gerekmez. Bellek için iyileştirilmiş bir tablo oluşturmak için MEMORY_OPTIMIZED = ON yan tümcesini kullanın.

  1. Bellek için iyileştirilmiş dbo.ShoppingCart tablosunu oluşturmak amacıyla aşağıdaki sorguyu çalıştırın. Varsayılan olarak, veriler dayanıklılık amacıyla diskte kalıcı hale getirilir (DAYANıKLıLıK, yalnızca şemayı kalıcı hale getirmek için de ayarlanabilir).

    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. Tabloya bazı kayıtlar ekleyin:

    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);
    

Yerel olarak derlenmiş saklı yordamlar

SQL Server, bellek için iyileştirilmiş tablolara erişen yerel olarak derlenmiş saklı yordamları destekler. T-SQL deyimleri makine koduna derlenir ve yerel DLL'ler olarak depolanır, böylece geleneksel T-SQL'den daha hızlı veri erişimi ve daha verimli sorgu yürütmesi sağlanır. NATIVE_COMPILATION ile işaretlenmiş saklı yordamlar yerel olarak derlenir.

  1. ShoppingCart tablosuna çok sayıda kayıt ekleyen doğal olarak derlenmiş bir prosedür oluşturmak için aşağıdaki komut dosyasını işleyin:

    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. 1.000.000 satır ekleyin:

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. Satırların eklendiğini doğrulayın:

    SELECT COUNT(*)
    FROM dbo.ShoppingCart;
    

Sorgu Deposu'yu kullanma

Sorgu Deposu sorgular, yürütme planları ve çalışma zamanı istatistikleri hakkında ayrıntılı performans bilgileri toplar.

SQL Server 2022 (16.x) öncesinde Sorgu Deposu varsayılan olarak etkinleştirilmez ve ALTER DATABASE ile etkinleştirilebilir:

ALTER DATABASE AdventureWorks2022
    SET QUERY_STORE = ON;

Sorgu Deposu'ndaki sorgular ve planlar hakkında bilgi döndürmek için aşağıdaki sorguyu çalıştırın:

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;

Dinamik yönetim görünümlerini sorgulama

Dinamik yönetim görünümleri, sunucu örneğinin durumunu izlemek, sorunları tanılamak ve performansı ayarlamak için kullanılabilecek sunucu durumu bilgilerini döndürür.

dm_os_wait istatistikleri dinamik yönetim görünümünü sorgulamak için:

SELECT wait_type,
       wait_time_ms
FROM sys.dm_os_wait_stats;