Esercizio - Informazioni sui problemi di prestazioni relativi alle tabelle

Completato
  1. Selezionare l'hub Sviluppo.

    The develop hub is highlighted.

  2. Nel menu Sviluppo selezionare il pulsante +(1) e scegliere Script SQL (2) dal menu di scelta rapida.

    The SQL script context menu item is highlighted.

  3. Nel menu della barra degli strumenti connettersi al database del pool SQL per eseguire la query.

    The connect to option is highlighted in the query toolbar.

  4. Nella finestra della query sostituire lo script con il codice seguente:

    SELECT  
        COUNT_BIG(*)
    FROM
        [wwi_perf].[Sale_Heap]
    
  5. Scegliere Esegui dal menu della barra degli strumenti per eseguire il comando SQL.

    The run button is highlighted in the query toolbar.

    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.

    The COUNT_BIG result is displayed.

  6. 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')
    
  7. Scegliere Esegui dal menu della barra degli strumenti per eseguire il comando SQL.

    The run button is highlighted in the query toolbar.

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

    The query execution time of 32 seconds is highlighted in the query results.

    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';
    
  8. Selezionare l'hub Dati.

    The data hub is highlighted.

  9. 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).

    The CREATE script is highlighted for the Sale_Heap table.

  10. 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.

    Shuffle move conceptual representation.

    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.