Passo a passo dos recursos de desempenho do SQL Server em LinuxWalkthrough for the performance features of SQL Server on Linux

APLICA-SE A: simSQL Server (somente Linux) nãoBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Se você for um usuário do Linux novo no SQL Server, as tarefas a seguir explicarão alguns dos recursos de desempenho.If you are a Linux user who is new to SQL Server, the following tasks walk you through some of the performance features. Elas não são exclusivas nem específicas do Linux, mas ajudam a dar uma ideia de áreas para posterior investigação.These are not unique or specific to Linux, but it helps to give you an idea of areas to investigate further. Em cada exemplo, um link é fornecido para a documentação detalhada dessa área.In each example, a link is provided to the depth documentation for that area.

Observação

Os exemplos a seguir usam o banco de dados de exemplo AdventureWorks.The following examples use the AdventureWorks sample database. Para obter instruções sobre como obter e instalar esse banco de dados de exemplo, confira Restaurar um banco de dados do SQL Server do Windows para o Linux.For instructions on how to obtain and install this sample database, see Restore a SQL Server database from Windows to Linux.

Criar um índice columnstoreCreate a Columnstore Index

Um índice columnstore é uma tecnologia para armazenar e consultar grandes armazenamentos de dados em um formato de dados colunar, denominado um columnstore.A columnstore index is a technology for storing and querying large stores of data in a columnar data format, called a columnstore.

  1. Adicione um índice columnstore à tabela SalesOrderDetail executando os seguintes comandos Transact-SQL: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. Execute a consulta a seguir que usa o índice columnstore para examinar a tabela: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. Verifique se o índice columnstore foi usado pesquisando a object_id do índice columnstore e confirmando que ele aparece nas estatísticas de uso da tabela 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');
    

Usar OLTP in-memoryUse In-Memory OLTP

O SQL Server fornece recursos de OLTP in-memory que podem melhorar muito o desempenho de sistemas de aplicativos.SQL Server provides In-Memory OLTP features that can greatly improve the performance of application systems. Esta seção do Guia de Avaliação percorrerá as etapas para criar uma tabela com otimização de memória armazenada na memória e um procedimento armazenado compilado nativamente que pode acessar a tabela sem precisar ser compilado ou interpretado.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.

Configurar banco de dados para OLTP in-memoryConfigure Database for In-Memory OLTP

  1. É recomendável definir o banco de dados para um nível de compatibilidade de pelo menos 130 para usar o OLTP in-memory.It's recommended to set the database to a compatibility level of at least 130 to use In-Memory OLTP. Use a consulta a seguir para verificar o nível de compatibilidade atual do 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 necessário, atualize o nível para 130:If necessary, update the level to 130:

    ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. Quando uma transação envolve uma tabela baseada em disco e uma tabela com otimização de memória, é essencial que uma parte com otimização de memória da transação opere no nível de isolamento da transação chamado 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. Para impor com segurança este nível para as tabelas com otimização de memória em uma transação entre contêineres, execute o seguinte: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. Antes de poder criar uma tabela com otimização de memória, você precisa criar primeiro um FILEGROUP com otimização de memória e um contêiner para arquivos de dados: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
    

Criar uma tabela com otimização de memóriaCreate a Memory-Optimized Table

O armazenamento primário de tabelas com otimização de memória é a memória principal; portanto, diferentemente das tabelas baseadas em disco, os dados não precisam ser lidos do disco para os buffers de memória.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. Para criar uma tabela com otimização de memória, use a cláusula MEMORY_OPTIMIZED = ON.To create a memory-optimized table, use the MEMORY_OPTIMIZED = ON clause.

  1. Execute a consulta a seguir para criar a tabela com otimização de memória dbo.ShoppingCart.Execute the following query to create the memory-optimized table dbo.ShoppingCart. Como padrão, os dados serão persistentes no disco para fins de durabilidade (observe que DURABILITY também pode ser definido para persistir apenas o esquema).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. Insira alguns recursos na tabela: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) 
    

Procedimento armazenado nativamente compiladoNatively compiled Stored Procedure

O SQL Server dá suporte a procedimentos armazenados nativamente compilados que acessam tabelas com otimização de memória.SQL Server supports natively compiled stored procedures that access memory-optimized tables. As instruções T-SQL são compiladas no código do computador e armazenadas como DLLs nativas, permitindo um acesso a dados mais rápido e uma execução de consulta mais eficiente do que o T-SQL tradicional.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. Os procedimentos armazenados que são marcados com NATIVE_COMPILATION são compilados nativamente.Stored procedures that are marked with NATIVE_COMPILATION are natively compiled.

  1. Execute o script a seguir para criar um procedimento armazenado compilado nativamente que insere um grande número de registros na tabela 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 
    
  2. Insira 1 milhão de linhas:Insert 1,000,000 rows:

    EXEC usp_InsertSampleCarts 1000000 
    
  3. Verifique se as linhas foram inseridas:Verify the rows have been inserted:

    SELECT COUNT(*) FROM dbo.ShoppingCart 
    

Saiba mais sobre o OLTP in-memoryLearn More About In-Memory OLTP

Para saber mais sobre o OLTP in-memory, confira os seguintes tópicos:For more information about In-Memory OLTP, see the following topics:

Usar o Repositório de ConsultasUse Query Store

O Repositório de Consultas coleta informações de desempenho detalhadas sobre consultas, planos de execução e estatísticas de runtime.Query Store collects detailed performance information about queries, execution plans, and runtime statistics.

O Repositório de Consultas não está ativo por padrão e pode ser habilitado com ALTER DATABASE:Query Store is not active by default and can be enabled with ALTER DATABASE:

ALTER DATABASE AdventureWorks SET QUERY_STORE = ON;

Execute a consulta a seguir para retornar informações sobre consultas e planos no repositório de consultas: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 ;

Consultar exibições de gerenciamento dinâmicoQuery Dynamic Management Views

As exibições de gerenciamento dinâmico retornam informações do estado do servidor que podem ser usadas para monitorar a integridade de uma instância do servidor, diagnosticar problemas e ajustar o desempenho.Dynamic management views return server state information that can be used to monitor the health of a server instance, diagnose problems, and tune performance.

Para consultar a exibição de gerenciamento dinâmico de estatísticas 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;