Procedura dettagliata per le funzionalità delle prestazioni di SQL Server in LinuxWalkthrough for the performance features of SQL Server on Linux

QUESTO ARGOMENTO SI APPLICA A: SìSQL Server (solo Linux)nonDatabase SQL di AzurenonAzure SQL Data Warehousenon Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (Linux only)noAzure SQL DatabasenoAzure SQL Data WarehousenoParallel Data Warehouse

Se sei un utente di Linux che è una novità di SQL Server, le attività seguenti illustrano alcune delle funzionalità delle prestazioni.If you are a Linux user who is new to SQL Server, the following tasks walk you through some of the performance features. Questi non sono specifiche di Linux o univoco, ma è utile per dare un'idea delle aree per analizzare ulteriormente il problema.These are not unique or specific to Linux, but it helps to give you an idea of areas to investigate further. In ogni esempio viene fornito un collegamento alla documentazione di profondità per quell'area.In each example, a link is provided to the depth documentation for that area.

Nota

Gli esempi seguenti usano il database di esempio AdventureWorks.The following examples use the AdventureWorks sample database. Per istruzioni su come ottenere e installare il database di esempio, vedere ripristinare un database di SQL Server da Windows a Linux.For instructions on how to obtain and install this sample database, see Restore a SQL Server database from Windows to Linux.

Creare un indice ColumnstoreCreate a Columnstore Index

Un indice columnstore è una tecnologia per l'archiviazione e query su grandi archivi di dati in un formato di dati in colonna, detto columnstore.A columnstore index is a technology for storing and querying large stores of data in a columnar data format, called a columnstore.

  1. Aggiungere un indice Columnstore sulla tabella SalesOrderDetail eseguendo i comandi Transact-SQL seguenti:Add a Columnstore index to the SalesOrderDetail table by executing the following Transact-SQL commands:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
       ON Sales.SalesOrderDetail
       (UnitPrice, OrderQty, ProductID)
    GO
    
  2. Eseguire la query seguente che usa l'indice Columnstore per analizzare la tabella seguente:Execute the following query that uses the Columnstore Index to scan the table:

    SELECT ProductID, SUM(UnitPrice) SumUnitPrice, AVG(UnitPrice) AvgUnitPrice,
       SUM(OrderQty) SumOrderQty, AVG(OrderQty) AvgOrderQty
    FROM Sales.SalesOrderDetail
       GROUP BY ProductID
       ORDER BY ProductID
    
  3. Verificare che l'indice Columnstore è stato usato da ricerca di object_id per l'indice Columnstore e per confermare che venga visualizzato in statistiche di utilizzo per la tabella SalesOrderDetail:Verify that the Columnstore Index was used by looking up the object_id for the Columnstore index and confirming that it appears in the usage stats for the SalesOrderDetail table:

    SELECT * FROM sys.indexes WHERE name = 'IX_SalesOrderDetail_ColumnStore'
    GO
    
    SELECT * 
    FROM sys.dm_db_index_usage_stats
       WHERE database_id = DB_ID('AdventureWorks')
       AND object_id = OBJECT_ID('AdventureWorks.Sales.SalesOrderDetail');
    

Usare OLTP In memoriaUse In-Memory OLTP

SQL Server fornisce le funzionalità di OLTP In memoria che possono migliorare notevolmente le prestazioni dei sistemi di applicazione.SQL Server provides In-Memory OLTP features that can greatly improve the performance of application systems. In questa sezione della Guida alla valutazione illustrerà i passaggi per creare una tabella con ottimizzazione per la memoria archiviata in memoria e una stored procedure compilata in modo nativo che può accedere alla tabella senza la necessità di essere compilate o interpretate.This section of the Evaluation Guide will walk you through the steps to create a memory-optimized table stored in memory and a natively compiled stored procedure that can access the table without needing to be compiled or interpreted.

Configurare i Database per OLTP In memoriaConfigure Database for In-Memory OLTP

  1. È consigliabile impostare il database a un livello di compatibilità di almeno 130 per usare OLTP In memoria.It’s recommended to set the database to a compatibility level of at least 130 to use In-Memory OLTP. Usare la query seguente per verificare il livello di compatibilità corrente di AdventureWorks:Use the following query to check the current compatibility level of AdventureWorks:

    USE AdventureWorks
    GO
    SELECT d.compatibility_level
    FROM sys.databases as d
      WHERE d.name = Db_Name();
    GO
    

    Se necessario, aggiornare il livello 130:If necessary, update the level to 130:

    ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. Quando una transazione include una tabella basata su disco e una tabella con ottimizzazione per la memoria, è essenziale che la parte con ottimizzazione per la memoria della transazione operano a livello di isolamento transazione denominato SNAPSHOT.When a transaction involves both a disk-based table and a memory-optimized table, it’s essential that the memory-optimized portion of the transaction operate at the transaction isolation level named SNAPSHOT. Per applicare in modo affidabile questo livello per le tabelle ottimizzate per la memoria in una transazione tra contenitori, eseguire le operazioni seguenti:To reliably enforce this level for memory-optimized tables in a cross-container transaction, execute the following:

    ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
    GO
    
  3. Prima di poter creare una tabella con ottimizzazione per la memoria è necessario innanzitutto creare un FILEGROUP con ottimizzazione per la memoria e un contenitore per i file di dati:Before you can create a memory-optimized table you must first create a Memory Optimized FILEGROUP and a container for data files:

    ALTER DATABASE AdventureWorks ADD FILEGROUP AdventureWorks_mod CONTAINS memory_optimized_data
    GO  
    ALTER DATABASE AdventureWorks ADD FILE (NAME='AdventureWorks_mod', FILENAME='/var/opt/mssql/data/AdventureWorks_mod') TO FILEGROUP AdventureWorks_mod
    GO
    

Creare una tabella con ottimizzazione per la memoriaCreate a Memory-Optimized Table

L'archivio primario per le tabelle ottimizzate per la memoria è la memoria principale e pertanto a differenza delle tabelle basate su disco, i dati non devono essere letta dal disco nei buffer di memoria.The primary store for memory-optimized tables is main memory and so unlike disk-based tables, data does not need to be read in from disk into memory buffers. Per creare una tabella con ottimizzazione per la memoria, usare il MEMORY_OPTIMIZED = ON clausola.To create a memory-optimized table, use the MEMORY_OPTIMIZED = ON clause.

  1. Eseguire la query seguente per creare la tabella ottimizzata per la memoria dbo. ShoppingCart.Execute the following query to create the memory-optimized table dbo.ShoppingCart. Per impostazione predefinita, i dati verranno resi persistenti su disco per motivi di durabilità (si noti che durabilità è anche possibile impostare in modo permanente solo lo schema).As a default, the data will be persisted on disk for durability purposes (Note that DURABILITY can also be set to persist the schema only).

    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. Inserire alcuni record nella tabella:Insert some records into the table:

    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) 
    

Stored Procedure compilate in modo nativoNatively compiled Stored Procedure

SQL Server supporta le stored procedure compilate in modo nativo che accedono alle tabelle ottimizzate per la memoria.SQL Server supports natively compiled stored procedures that access memory-optimized tables. Le istruzioni T-SQL vengono compilate in codice macchina e archiviate come DLL native, consentendo l'accesso ai dati più veloce e l'esecuzione di query più efficiente rispetto alle tradizionali soluzioni T-SQL.The T-SQL statements are compiled to machine code and stored as native DLLs, enabling faster data access and more efficient query execution than traditional T-SQL. Le stored procedure che sono contrassegnate con NATIVE_COMPILATION vengono compilate in modo nativo.Stored procedures that are marked with NATIVE_COMPILATION are natively compiled.

  1. Eseguire lo script seguente per creare una stored procedure compilata in modo nativo che inserisce un numero elevato di record nella tabella ShoppingCart:Execute the following script to create a natively compiled stored procedure that inserts a large number of records into the ShoppingCart table:
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 
  1. Inserire 1.000.000 di righe:Insert 1,000,000 rows:

    EXEC usp_InsertSampleCarts 1000000 
    
  2. Verificare che le righe sono state inserite:Verify the rows have been inserted:

    SELECT COUNT(*) FROM dbo.ShoppingCart 
    

Altre informazioni su OLTP In memoriaLearn More About In-Memory OLTP

Per ulteriori informazioni su OLTP In memoria, vedere gli argomenti seguenti:For more information about In-Memory OLTP, see the following topics:

Usare Query StoreUse Query Store

Query Store raccoglie informazioni dettagliate sulle prestazioni relative query, piani di esecuzione e le statistiche di runtime.Query Store collects detailed performance information about queries, execution plans, and runtime statistics.

Query Store non è attiva per impostazione predefinita e può essere abilitata con ALTER DATABASE:Query Store is not active by default and can be enabled with ALTER DATABASE:

ALTER DATABASE AdventureWorks SET QUERY_STORE = ON;

Eseguire la query seguente per restituire informazioni sulle query e piani in archivio query:Run the following query to return information about queries and plans in the query store:

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 ;

Viste a gestione dinamica delle queryQuery Dynamic Management Views

Viste a gestione dinamica restituiscono informazioni sullo stato di server che possono essere utilizzate per monitorare l'integrità di un'istanza del server, diagnosticare i problemi e ottimizzare le prestazioni.Dynamic management views return server state information that can be used to monitor the health of a server instance, diagnose problems, and tune performance.

Per eseguire query sulla vista a gestione dinamica delle statistiche dm_os_wait:To query the dm_os_wait stats dynamic management view:

SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats;