Eventi
Ottieni gratuitamente la certificazione in Microsoft Fabric.
19 nov, 23 - 10 dic, 23
Per un periodo di tempo limitato, il team della community di Microsoft Fabric offre buoni per esami DP-600 gratuiti.
Prepara oraQuesto browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
Si applica a: Istanza gestita di SQL di Azure SQL
Le tecnologie in memoria in Istanza gestita di SQL di Azure del database SQL di Azure consentono di migliorare le prestazioni dell'applicazione e ridurre potenzialmente i costi del database. Usando le tecnologie in memoria in Istanza gestita di SQL di Azure, è possibile ottenere miglioramenti delle prestazioni con diversi carichi di lavoro.
In questo articolo verranno esaminati due esempi che illustrano l'uso di OLTP in memoria e degli indici columnstore in Istanza gestita di SQL di Azure.
Per altre informazioni, vedi:
Per una dimostrazione più semplice e visivamente più interessante sulle prestazioni di OLTP in memoria, vedere:
È possibile ripristinare il database AdventureWorksLT
di esempio con alcuni passaggi T-SQL in SQL Server Management Studio (SSMS). Per altre informazioni sul ripristino di un database nell'istanza gestita di SQL, vedere Avvio rapido: ripristinare un database in Istanza gestita di SQL di Azure con SSMS.
I passaggi descritti in questa sezione illustrano come migliorare il database AdventureWorksLT
con oggetti OLTP in memoria e dimostra i vantaggi sulle prestazioni.
Aprire SSMS e connettersi all'Istanza gestita di SQL.
Nota
Le connessioni al Istanza gestita di SQL di Azure dalla workstation locale o da una macchina virtuale di Azure possono essere stabilite in modo sicuro, senza aprire l'accesso pubblico. Considerare Avvio rapido: configurare una connessione locale da punto a sito a Istanza gestita di SQL di Azure o Avvio rapido: configurare una macchina virtuale di Azure per connettersi a Istanza gestita di SQL di Azure.
In Esplora oggetti fare clic con il pulsante destro del mouse sull'istanza gestita di SQL e scegliere Nuova query per aprire una nuova finestra di query.
Eseguire lo script SQL seguente, che usa un account di archiviazione preconfigurato e una chiave di firma di accesso condiviso per creare le credenziali nell'istanza gestita di SQL. Con l'archiviazione disponibile pubblicamente, non è necessaria alcuna firma di firma di accesso condiviso.
CREATE CREDENTIAL [https://mitutorials.blob.core.windows.net/examples/]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE';
Eseguire lo script seguente per ripristinare il database AdventureWorksLT
.
RESTORE DATABASE [AdventureWorksLT]
FROM URL = 'https://mitutorials.blob.core.windows.net/examples/AdventureWorksLT2022.bak';
Eseguire lo script seguente per tenere traccia dello stato del ripristino.
SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete
, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE');
Al termine del ripristino, visualizzare il database AdventureWorksLT
in Esplora oggetti. È possibile verificare che il ripristino del database AdventureWorksLT
sia stato completato usando la vista sys.dm_operation_status.
Tabelle: l'esempio contiene le tabelle ottimizzate per la memoria seguenti:
SalesLT.Product_inmem
SalesLT.SalesOrderHeader_inmem
SalesLT.SalesOrderDetail_inmem
Demo.DemoSalesOrderHeaderSeed
Demo.DemoSalesOrderDetailSeed
È possibile filtrare per mostrare solo le tabelle ottimizzate per la memoria in Esplora oggetti in SSMS. Quando si fa clic con il pulsante destro del mouse su Tabelle, passare a >Filtra>Impostazioni filtro>È ottimizzato per la memoria. Il valore è uguale a 1
.
In alternativa, è possibile eseguire una query delle viste del catalogo, ad esempio:
SELECT is_memory_optimized, name, type_desc, durability_desc
FROM sys.tables
WHERE is_memory_optimized = 1;
Stored procedure compilata in modo nativo: è possibile esaminare SalesLT.usp_InsertSalesOrder_inmem
usando una query delle viste del catalogo:
SELECT uses_native_compilation, OBJECT_NAME(object_id), definition
FROM sys.sql_modules
WHERE uses_native_compilation = 1;
L'unica differenza tra le due stored procedure seguenti è che la prima usa versioni delle tabelle ottimizzate per la memoria, mentre la seconda usa tabelle basate su disco tradizionali:
SalesLT.usp_InsertSalesOrder_inmem
SalesLT.usp_InsertSalesOrder_ondisk
Questa sezione illustra come usare l'utilità ostress.exe per eseguire le due stored procedure in condizioni di sovraccarico. È possibile mettere a confronto i tempi necessari per il completamento dei due test di stress.
È consigliabile pianificare l'esecuzione di ostress.exe su una macchina virtuale di Azure. Si creerebbe una macchina virtuale di Azure nella stessa area di Azure dell'istanza gestita di SQL. È tuttavia possibile eseguire ostress.exe nella workstation locale, purché sia possibile connettersi all'istanza gestita di SQL di Azure.
Installare nella macchina virtuale o nell'host scelto le utilità RML (Replay Markup Language), che includono ostress.exe.
Per altre informazioni, vedi:
Questa sezione illustra lo script T-SQL incorporato nella riga di comando ostress.exe. Lo script usa gli elementi creati dallo script T-SQL installato in precedenza.
Quando si esegue ostress.exe, è consigliabile passare valori di parametri specifici per sollecitare il carico di lavoro utilizzando entrambe le seguenti strategie:
-n100
.-r500
.È opportuno, tuttavia, iniziare con valori molto più bassi, ad esempio -n10
e -r50
, per assicurarsi che tutto funzioni correttamente.
Lo script riportato di seguito inserisce un ordine di vendita di esempio con cinque voci nelle tabelle ottimizzate per la memoria seguenti:
SalesLT.SalesOrderHeader_inmem
SalesLT.SalesOrderDetail_inmem
DECLARE
@i int = 0,
@od SalesLT.SalesOrderDetailType_inmem,
@SalesOrderID int,
@DueDate datetime2 = sysdatetime(),
@CustomerID int = rand() * 8000,
@BillToAddressID int = rand() * 10000,
@ShipToAddressID int = rand() * 10000;
INSERT INTO @od
SELECT OrderQty, ProductID
FROM Demo.DemoSalesOrderDetailSeed
WHERE OrderID= cast((rand()*60) as int);
WHILE (@i < 20)
BEGIN;
EXECUTE SalesLT.usp_InsertSalesOrder_inmem @SalesOrderID OUTPUT,
@DueDate, @CustomerID, @BillToAddressID, @ShipToAddressID, @od;
SET @i = @i + 1;
END
Per creare la versione _ondisk dello script T-SQL precedente per ostress.exe, occorre sostituire le due occorrenze della sottostringa _inmem con _ondisk. Queste sostituzioni interessano i nomi delle tabelle e delle stored procedure.
Per eseguire la riga di comando ostress.exe è possibile usare una finestra del prompt dei comandi RML . I parametri della riga di comando indicano al comando ostress di:
ostress.exe -n100 -r50 -S<servername>.database.windows.net -U<login> -P<password> -d<database> -q -Q"DECLARE @i int = 0, @od SalesLT.SalesOrderDetailType_inmem, @SalesOrderID int, @DueDate datetime2 = sysdatetime(), @CustomerID int = rand() * 8000, @BillToAddressID int = rand() * 10000, @ShipToAddressID int = rand()* 10000; INSERT INTO @od SELECT OrderQty, ProductID FROM Demo.DemoSalesOrderDetailSeed WHERE OrderID= cast((rand()*60) as int); WHILE (@i < 20) begin; EXECUTE SalesLT.usp_InsertSalesOrder_inmem @SalesOrderID OUTPUT, @DueDate, @CustomerID, @BillToAddressID, @ShipToAddressID, @od; set @i += 1; end"
Per eseguire la riga di comando ostress.exe precedente:
Reimpostare il contenuto dei dati del database eseguendo questo comando in SSMS per eliminare tutti i dati inseriti da esecuzioni precedenti:
EXECUTE Demo.usp_DemoReset;
Copiare il testo della riga di comando ostress.exe precedente negli Appunti.
Sostituire <placeholders>
per i parametri -S -U -P -d
con i valori reali corretti.
Eseguire la riga di comando modificata in una finestra dei comandi RML.
Al termine, ostress.exe scrive la durata dell'esecuzione come ultima riga di output nella finestra dei comandi RML. Ad esempio, per un'esecuzione dei test più breve, durata circa 1,5 minuti:
11/12/15 00:35:00.873 [0x000030A8] OSTRESS exiting normally, elapsed time: 00:01:31.867
Dopo aver ottenuto il risultato dell'esecuzione _inmem, seguire la procedura indicata di seguito per l'esecuzione _ondisk:
Reimpostare il database eseguendo questo comando in SSMS per eliminare tutti i dati inseriti dall'esecuzione precedente:
EXECUTE Demo.usp_DemoReset;
Modificare la riga di comando ostress.exe per sostituire tutte le occorrenze di _inmem con _ondisk.
Eseguire ostress.exe per la seconda volta e acquisire il risultato relativo alla durata.
Reimpostare nuovamente il database, per eliminare in modo responsabile una potenziale grande quantità di dati di test.
I test delle funzionalità in memoria hanno mostrato un miglioramento delle prestazioni pari a 9 volte per questo semplice carico di lavoro, con l'utilità ostress
in esecuzione in una VM di Azure nella stessa area di Azure del database.
In questa sezione vengono messi a confronto i risultati di statistiche e IO quando si usa un indice columnstore rispetto a un indice ad albero B tradizionale.
Per l'analisi in tempo reale in un carico di lavoro OLTP, è spesso preferibile usare un indice columnstore non cluster. Per informazioni dettagliate, vedere Descrizione degli indici columnstore.
Ripristinare un nuovo database AdventureWorksLT
nell'istanza gestita di SQL, sovrascrivendo il database esistente installato in precedenza, usando WITH REPLACE
.
RESTORE DATABASE [AdventureWorksLT]
FROM URL = 'https://mitutorials.blob.core.windows.net/examples/AdventureWorksLT2022.bak'
WITH REPLACE;
Copiare sql_in-memory_analytics_sample negli Appunti.
AdventureWorksLT
di esempio creato nel passaggio 1.Incollare lo script T-SQL in SSMS.exe, quindi eseguirlo. La parola chiave COLUMNSTORE è fondamentale in una istruzione CREATE INDEX
: CREATE NONCLUSTERED COLUMNSTORE INDEX ...;
Impostare AdventureWorksLT
sul livello di compatibilità più recente, SQL Server 2022 (160): ALTER DATABASE AdventureworksLT SET compatibility_level = 160;
dbo.FactResellerSalesXL_CCI
è una tabella contenente un indice columnstore cluster, che presenta una compressione avanzata a livello di dati.
dbo.FactResellerSalesXL_PageCompressed
è una tabella contenente un indice cluster equivalente tradizionale, che presenta una compressione solo a livello di pagina.
Sono disponibili diversi tipi di query T-SQ che è possibile eseguire per migliorare le prestazioni. Nel passaggio 2 nello script T-SQL, prestare attenzione a questa coppia di query. Le due query differiscono per una sola riga:
FROM FactResellerSalesXL_PageCompressed AS a
FROM FactResellerSalesXL_CCI AS a
Un indice columnstore cluster si trova nella tabella FactResellerSalesXL_CCI
.
Lo script T-SQL seguente stampa le statistiche logiche di I/O e ora, usando IMPOSTS STATISTICHE IO e IMPOSTA STATISTICHE ORA per ogni query.
/*********************************************************************
Step 2 -- Overview
-- Page Compressed BTree table v/s Columnstore table performance differences
-- Enable actual Query Plan in order to see Plan differences when Executing
*/
-- Ensure Database is in 130 compatibility mode
ALTER DATABASE AdventureworksLT SET compatibility_level = 160
GO
-- Execute a typical query that joins the Fact Table with dimension tables
-- Note this query will run on the Page Compressed table, Note down the time
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT c.Year
,e.ProductCategoryKey
,FirstName + ' ' + LastName AS FullName
,count(SalesOrderNumber) AS NumSales
,sum(SalesAmount) AS TotalSalesAmt
,Avg(SalesAmount) AS AvgSalesAmt
,count(DISTINCT SalesOrderNumber) AS NumOrders
,count(DISTINCT a.CustomerKey) AS CountCustomers
FROM FactResellerSalesXL_PageCompressed AS a
INNER JOIN DimProduct AS b ON b.ProductKey = a.ProductKey
INNER JOIN DimCustomer AS d ON d.CustomerKey = a.CustomerKey
Inner JOIN DimProductSubCategory AS e on e.ProductSubcategoryKey = b.ProductSubcategoryKey
INNER JOIN DimDate AS c ON c.DateKey = a.OrderDateKey
GROUP BY e.ProductCategoryKey,c.Year,d.CustomerKey,d.FirstName,d.LastName
GO
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
GO
-- This is the same Prior query on a table with a clustered columnstore index CCI
-- The comparison numbers are even more dramatic the larger the table is (this is an 11 million row table only)
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT c.Year
,e.ProductCategoryKey
,FirstName + ' ' + LastName AS FullName
,count(SalesOrderNumber) AS NumSales
,sum(SalesAmount) AS TotalSalesAmt
,Avg(SalesAmount) AS AvgSalesAmt
,count(DISTINCT SalesOrderNumber) AS NumOrders
,count(DISTINCT a.CustomerKey) AS CountCustomers
FROM FactResellerSalesXL_CCI AS a
INNER JOIN DimProduct AS b ON b.ProductKey = a.ProductKey
INNER JOIN DimCustomer AS d ON d.CustomerKey = a.CustomerKey
Inner JOIN DimProductSubCategory AS e on e.ProductSubcategoryKey = b.ProductSubcategoryKey
INNER JOIN DimDate AS c ON c.DateKey = a.OrderDateKey
GROUP BY e.ProductCategoryKey,c.Year,d.CustomerKey,d.FirstName,d.LastName
GO
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
GO
A seconda della configurazione dell'istanza gestita di SQL, è possibile prevedere miglioramenti significativi delle prestazioni per questa query usando l'indice columnstore cluster rispetto all'indice tradizionale.
Eventi
Ottieni gratuitamente la certificazione in Microsoft Fabric.
19 nov, 23 - 10 dic, 23
Per un periodo di tempo limitato, il team della community di Microsoft Fabric offre buoni per esami DP-600 gratuiti.
Prepara ora