Delen via


Overzicht van de prestatiefuncties van SQL Server in Linux

van toepassing op:SQL Server- - Linux

Als u een Linux-gebruiker bent die niet bekend is met SQL Server, doorloopt u een aantal van de prestatiefuncties in de volgende taken. Deze zijn niet uniek of specifiek voor Linux, maar het helpt u een idee te geven van gebieden om verder te onderzoeken. In elk voorbeeld wordt een koppeling naar de uitgebreide documentatie voor dat gebied gegeven.

Notitie

In de volgende voorbeelden wordt de AdventureWorks2022 voorbeelddatabase gebruikt. Zie Een SQL Server-database migreren van Windows naar Linux met behulp van back-up en herstelvoor instructies over het verkrijgen en installeren van deze voorbeelddatabase.

Een columnstore-index maken

Een columnstore-index is een technologie voor het opslaan en opvragen van grote gegevensarchieven in een kolomgegevensindeling, een columnstore genaamd.

  1. Voeg een columnstore-index toe aan de SalesOrderDetail tabel door de volgende Transact-SQL opdrachten uit te voeren:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
        ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID);
    GO
    
  2. Voer de volgende query uit die gebruikmaakt van de columnstore-index om de tabel te scannen:

    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. Controleer of de columnstore-index is gebruikt door de object_id voor de columnstore-index op te zoeken en te bevestigen dat deze wordt weergegeven in de gebruiksstatistieken voor de 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');
    

In-Memory OLTP gebruiken

SQL Server biedt In-Memory OLTP-functies waarmee de prestaties van toepassingssystemen aanzienlijk kunnen worden verbeterd. In deze sectie wordt u begeleid bij de stappen voor het maken van een tabel die is geoptimaliseerd voor geheugen en een systeemeigen gecompileerde opgeslagen procedure die toegang heeft tot de tabel zonder dat deze hoeft te worden gecompileerd of geïnterpreteerd.

Database configureren voor In-Memory OLTP

  1. U moet de database instellen op een compatibiliteitsniveau van ten minste 130 om In-Memory OLTP te gebruiken. Gebruik de volgende query om het huidige compatibiliteitsniveau van AdventureWorks2022te controleren:

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

    Werk indien nodig het niveau bij naar 130:

    ALTER DATABASE CURRENT
        SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. Wanneer een transactie zowel een tabel op basis van schijf als een tabel met geoptimaliseerd geheugen omvat, is het essentieel dat het voor geheugen geoptimaliseerde gedeelte van de transactie werkt op het niveau van transactieisolatie met de naam SNAPSHOT. Als u dit niveau betrouwbaar wilt afdwingen voor tabellen die zijn geoptimaliseerd voor geheugen in een transactie tussen containers, voert u het volgende uit:

    ALTER DATABASE CURRENT
        SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
    GO
    
  3. Voordat u een tabel kunt maken die is geoptimaliseerd voor geheugen, moet u eerst een voor geheugen geoptimaliseerde bestandsgroep en een container voor gegevensbestanden maken:

    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
    

Een tabel maken die is geoptimaliseerd voor geheugen

Het primaire archief voor tabellen die zijn geoptimaliseerd voor geheugen is hoofdgeheugen en dus in tegenstelling tot tabellen op basis van schijven, hoeven gegevens niet van schijf in geheugenbuffers te worden gelezen. Als u een tabel wilt maken die is geoptimaliseerd voor geheugen, gebruikt u de component MEMORY_OPTIMIZED = ON.

  1. Voer de volgende query uit om de geheugen-geoptimaliseerde tabel dbo.ShoppingCart te maken. Als standaard worden de gegevens op schijf bewaard voor duurzaamheid (DUURZAAMHEID kan ook worden ingesteld om het schema alleen te behouden).

    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. Voeg enkele records in de tabel in:

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

Systeemeigen gecompileerde opgeslagen procedures

SQL Server ondersteunt systeemeigen gecompileerde opgeslagen procedures voor toegang tot tabellen die zijn geoptimaliseerd voor geheugen. De T-SQL-instructies worden gecompileerd naar machinecode en opgeslagen als systeemeigen DLL's, waardoor snellere gegevenstoegang en efficiëntere queryuitvoering mogelijk zijn dan traditionele T-SQL. Opgeslagen procedures die zijn gemarkeerd met NATIVE_COMPILATION worden systeemeigen gecompileerd.

  1. Voer het volgende script uit om een systeemeigen gecompileerde opgeslagen procedure te maken waarmee een groot aantal records wordt ingevoegd in de 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. 1000.000 rijen invoegen:

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. Controleer of de rijen zijn ingevoegd:

    SELECT COUNT(*)
    FROM dbo.ShoppingCart;
    

Query Store gebruiken

Query Store verzamelt gedetailleerde prestatiegegevens over query's, uitvoeringsplannen en runtimestatistieken.

Vóór SQL Server 2022 (16.x) is Query Store niet standaard ingeschakeld en kan deze worden ingeschakeld met ALTER DATABASE:

ALTER DATABASE AdventureWorks2022
    SET QUERY_STORE = ON;

Voer de volgende query uit om informatie te retourneren over query's en plannen in de Query Store:

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;

Dynamische beheerweergaven opvragen

Dynamische beheerweergaven retourneren serverstatusinformatie die kan worden gebruikt om de gezondheid van een serverinstantie te bewaken, problemen te diagnosticeren en de prestaties af te stemmen.

Volg de volgende stappen om een query uit te voeren op de dynamische beheerweergave van de dm_os_wait-statistieken:

SELECT wait_type,
       wait_time_ms
FROM sys.dm_os_wait_stats;