Condividi tramite


Ottimizzazione della tabella NewOrg

La tabella NewOrd creata nell'attività Popolamento di una tabella con dati gerarchici esistenti contiene tutte le informazioni sul personale e rappresenta la struttura gerarchica utilizzando un tipo di dati hierarchyid. Questa attività aggiunge indici nuovi per supportare ricerche nella colonna hierarchyid.

Indice cluster

La colonna hierarchyid (OrgNode) è la chiave primaria della tabella NewOrg. Quando la tabella è stata creata, conteneva un indice cluster denominato PK_NewOrg_OrgNode per applicare l'univocità della colonna OrgNode. Questo indice cluster supporta anche una ricerca approfondita nella tabella.

Indice non cluster

Questo passaggio crea due indici non cluster per supportare le ricerche tipiche.

Per indicizzare la tabella NewOrg per eseguire ricerche efficienti

  1. Per facilitare le query allo stesso livello nella gerarchia, utilizzare il metodo GetLevel per creare una colonna calcolata contenente il livello della gerarchia. Successivamente, creare un indice composto nel livello e Hierarchyid. Eseguire il codice seguente per creare la colonna calcolata e l'indice breadth-first:

    ALTER TABLE NewOrg 
       ADD H_Level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON NewOrg(H_Level, OrgNode) ;
    GO
    
  2. Creare un indice univoco nella colonna EmployeeID. Si tratta della ricerca singleton tradizionale di un solo dipendente in base al numero EmployeeID. Eseguire il codice seguente per creare un indice in EmployeeID:

    CREATE UNIQUE INDEX EmpIDs_unq ON NewOrg(EmployeeID) ;
    GO
    
  3. Eseguire il codice seguente per recuperare i dati dalla tabella nell'ordine di ognuno dei tre indici:

    SELECT OrgNode.ToString() AS LogicalNode,
    OrgNode, H_Level, EmployeeID, LoginID
    FROM NewOrg 
    ORDER BY OrgNode;
    
    SELECT OrgNode.ToString() AS LogicalNode,
    OrgNode, H_Level, EmployeeID, LoginID 
    FROM NewOrg 
    ORDER BY H_Level, OrgNode;
    
    SELECT OrgNode.ToString() AS LogicalNode,
    OrgNode, H_Level, EmployeeID, LoginID 
    FROM NewOrg 
    ORDER BY EmployeeID;
    GO
    
  4. Confrontare i set di risultati per visualizzare il modo in cui l'ordine viene archiviato in ogni tipo di indice. Seguono solo le prime quattro righe di ogni output.

    Set di risultati:

    Indice depth-first: i record relativi ai dipendenti vengono archiviati accanto al responsabile.

    LogicalNode OrgNode H_Level EmployeeID LoginID

    / 0x 0 1 zarifin

    /1/ 0x58 1 2 tplate

    /1/1/ 0x5AC0 2 4 schai

    /1/1/1/ 0x5AD6 3 9 jwang

    /1/1/2/ 0x5ADA 3 10 malexander

    /1/2/ 0x5B40 2 5 elang

    /1/3/ 0x5BC0 2 6 gsmits

    /2/ 0x68 1 3 hjensen

    /2/1/ 0x6AC0 2 7 sdavis

    /2/2/ 0x6B40 2 8 norint

    Indice EmployeeID-first: le righe vengono archiviate nella sequenza di EmployeeID.

    LogicalNode OrgNode H_Level EmployeeID LoginID

    / 0x 0 1 zarifin

    /1/ 0x58 1 2 tplate

    /2/ 0x68 1 3 hjensen

    /1/1/ 0x5AC0 2 4 schai

    /1/2/ 0x5B40 2 5 elang

    /1/3/ 0x5BC0 2 6 gsmits

    /2/1/ 0x6AC0 2 7 sdavis

    /2/2/ 0x6B40 2 8 norint

    /1/1/1/ 0x5AD6 3 9 jwang

    /1/1/2/ 0x5ADA 3 10 malexander

Nota

Per i diagrammi che mostrano la differenza tra un indice depth-first e un indice breadth-first, vedere Utilizzo dei tipi di dati hierarchyid (Motore di database).

Per eliminare le colonne non necessarie

  1. La colonna ManagerID rappresenta la relazione dipendente/responsabile che ora è rappresentata dalla colonna OrgNode. Se le altre applicazioni non richiedono la colonna ManagerID, si consiglia di eliminarla utilizzando l'istruzione seguente:

    ALTER TABLE NewOrg DROP COLUMN ManagerID ;
    GO
    
  2. La colonna EmployeeID è anche ridondante. La colonna OrgNode identifica in modo univoco ogni dipendente. Se le altre applicazioni non richiedono la colonna EmployeeID, eliminare l'indice e successivamente la colonna utilizzando il codice seguente:

    DROP INDEX EmpIDs_unq ON NewOrg ;
    ALTER TABLE NewOrg DROP COLUMN EmployeeID ;
    GO
    

Per sostituire la tabella originale con la tabella nuova

  1. Se la tabella originale contiene vincoli o indici aggiuntivi, aggiungerli alla tabella NewOrg.

  2. Sostituire la vecchia colonna EmployeeDemo con la nuova tabella. Eseguire il codice seguente per rilasciare la vecchia tabella e successivamente rinominare la tabella nuova con il nome vecchio:

    DROP TABLE EmployeeDemo ;
    GO
    sp_rename 'NewOrg', EmployeeDemo ;
    GO
    
  3. Eseguire il codice seguente per esaminare la tabella finale:

    SELECT * FROM EmployeeDemo ;