Esercizio - Informazioni sui problemi di prestazioni relativi alle tabelle
Individuare i problemi di prestazioni relativi alle tabelle
Selezionare l'hub Sviluppo.
Nel menu Sviluppo selezionare il pulsante +(1) e scegliere Script SQL (2) dal menu di scelta rapida.
Nel menu della barra degli strumenti connettersi al database del pool SQL per eseguire la query.
Nella finestra della query sostituire lo script con il codice seguente:
SELECT COUNT_BIG(*) FROM [wwi_perf].[Sale_Heap]
Scegliere Esegui dal menu della barra degli strumenti per eseguire il comando SQL.
L'esecuzione dello script richiede fino a 15 secondi e restituisce un numero di ~ 340 milioni di righe nella tabella.
Se lo script è ancora in esecuzione dopo 45 secondi, fare clic su Cancel (Annulla).
Nota
Non eseguire questa query in anticipo. In tal caso, è possibile che la query sia più veloce durante le esecuzioni successive.
Nella finestra della query sostituire lo script con l'istruzione seguente (più complessa):
SELECT TOP 1000 * FROM ( SELECT S.CustomerId ,SUM(S.TotalAmount) as TotalAmount FROM [wwi_perf].[Sale_Heap] S GROUP BY S.CustomerId ) T OPTION (LABEL = 'Lab03: Heap')
Scegliere Esegui dal menu della barra degli strumenti per eseguire il comando SQL.
L'esecuzione dello script richiede fino a 30 secondi e restituisce il risultato. È evidente che vi sia un errore nella tabella
Sale_Heap
che provoca il calo delle prestazioni.Se lo script è ancora in esecuzione dopo un minuto, fare clic su Cancel (Annulla).
Nota
La clausola OPTION usata nell'istruzione. Questa operazione è utile quando si vuole identificare la query nella DMV sys.dm_pdw_exec_requests.
SELECT * FROM sys.dm_pdw_exec_requests WHERE [label] = 'Lab03: Heap';
Selezionare l'hub Dati.
Espandere il database SQLPool01 e il relativo elenco Tables (1) (Tabelle). Fare clic con il pulsante destro del mouse su
wwi_perf.Sale_Heap
(2), selezionare New SQL script (3) (Nuovo script SQL) e quindi CREATE (4).Esaminare lo script usato per creare la tabella:
CREATE TABLE [wwi_perf].[Sale_Heap] ( [TransactionId] [uniqueidentifier] NOT NULL, [CustomerId] [int] NOT NULL, [ProductId] [smallint] NOT NULL, [Quantity] [tinyint] NOT NULL, [Price] [decimal](9,2) NOT NULL, [TotalAmount] [decimal](9,2) NOT NULL, [TransactionDateId] [int] NOT NULL, [ProfitAmount] [decimal](9,2) NOT NULL, [Hour] [tinyint] NOT NULL, [Minute] [tinyint] NOT NULL, [StoreId] [smallint] NOT NULL ) WITH ( DISTRIBUTION = ROUND_ROBIN, HEAP )
Nota
Non eseguire questo script. È solo a scopo dimostrativo per rivedere lo schema.
È possibile individuare immediatamente almeno due motivi per il calo delle prestazioni:
- La distribuzione
ROUND_ROBIN
- La struttura
HEAP
della tabella
Nota
In questo caso, quando si vogliono tempi di risposta rapidi delle query, la struttura heap non è una scelta ottimale, come si vedrà tra breve. Tuttavia, esistono casi in cui l'uso di una tabella heap può migliorare le prestazioni anziché danneggiarle. Uno di questi è quando si vogliono inserire grandi quantità di dati nel pool SQL.
Se si rivede il piano di query nei dettagli, si vedrà chiaramente la causa principale del problema di prestazioni: lo spostamento di dati tra più distribuzioni.
Lo spostamento di dati è un'operazione in cui parti delle tabelle distribuite vengono spostate a nodi diversi durante l'esecuzione della query. Questa operazione è necessaria quando i dati non sono disponibili nel nodo di destinazione, solitamente quando le tabelle non condividono la chiave di distribuzione. L'operazione di spostamento di dati più comune è lo spostamento casuale. Nello spostamento casuale, per ogni riga di input, Synapse calcola un valore hash usando le colonne di join e quindi invia tale riga al nodo proprietario del valore hash. Uno o entrambi i lati del join possono partecipare allo spostamento casuale. Il diagramma seguente mostra la sequenza casuale per implementare il join tra le tabelle T1 e T2 nella situazione in cui nessuna delle tabelle viene distribuita nella colonna di join col2.
Si tratta in effetti di uno degli esempi più semplici, data la piccola quantità dei dati che devono essere spostati in modo casuale. È possibile immaginare quanto si complichi la situazione quando le dimensioni della riga con spostamento casuale diventano più grandi.
- La distribuzione