Lezione 1-3: Ottimizzazione della tabella NewOrgLesson 1-3 - Optimizing the NewOrg Table

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 usando un tipo di dati hierarchyid .The NewOrd table that you created in the Populating a Table with Existing Hierarchical Data task contains all the employee information, and represents the hierarchical structure by using a hierarchyid data type. Questa attività aggiunge indici nuovi per supportare ricerche nella colonna hierarchyid .This task adds new indexes to support searches on the hierarchyid column.

Indice clusterClustered Index

La colonna hierarchyid (OrgNode) è la chiave primaria della tabella NewOrg .The hierarchyid column (OrgNode) is the primary key for the NewOrg table. Quando la tabella è stata creata, conteneva un indice cluster denominato PK_NewOrg_OrgNode per applicare l'univocità della colonna OrgNode .When the table was created, it contained a clustered index named PK_NewOrg_OrgNode to enforce the uniqueness of the OrgNode column. Questo indice cluster supporta anche una ricerca in profondità nella tabella.This clustered index also supports a depth-first search of the table.

Indice non clusterNonclustered Index

Questo passaggio crea due indici non cluster per supportare le ricerche tipiche.This step creates two nonclustered indexes to support typical searches.

Per indicizzare la tabella NewOrg per eseguire ricerche efficientiTo index the NewOrg table for efficient searches

  1. Per facilitare le query allo stesso livello nella gerarchia, usare il metodo GetLevel per creare una colonna calcolata contenente il livello della gerarchia.To help queries at the same level in the hierarchy, use the GetLevel method to create a computed column that contains the level in the hierarchy. Quindi, creare un indice composto nel livello e Hierarchyid.Then, create a composite index on the level and the Hierarchyid. Eseguire il codice seguente per creare la colonna calcolata e l'indice breadth-first:Run the following code to create the computed column and the breadth-first index:

    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 .Create a unique index on the EmployeeID column. Si tratta della ricerca singleton tradizionale di un solo dipendente in base al numero EmployeeID .This is the traditional singleton lookup of a single employee by EmployeeID number. Eseguire il codice seguente per creare un indice in EmployeeID:Run the following code to create an index on 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:Run the following code to retrieve data from the table in the order of each of the three indexes:

    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.Compare the result sets to see how the order is stored in each type of index. Seguono solo le prime quattro righe di ogni output.Only the first four rows of each output follow.

    Set di risultati:Here is the result set.

    Indice depth-first: i record relativi ai dipendenti vengono archiviati accanto al responsabile.Depth-first index: Employee records are stored adjacent to their manager.

    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.EmployeeID-first index: Rows are stored in EmployeeID sequence.

    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 indicano la differenza tra un indice depth-first e un indice breadth-first, vedere Dati gerarchici (SQL Server).For diagrams that show the difference between a depth-first index and a breadth-first index, see Hierarchical Data (SQL Server).

Per eliminare le colonne non necessarieTo drop the unnecessary columns

  1. La colonna ManagerID rappresenta la relazione dipendente/responsabile che ora è rappresentata dalla colonna OrgNode .The ManagerID column represents the employee/manager relationship, which is now represented by the OrgNode column. Se le altre applicazioni non richiedono la colonna ManagerID , si consiglia di eliminarla usando l'istruzione seguente:If other applications do not need the ManagerID column, consider dropping it by using the following statement:

    ALTER TABLE NewOrg DROP COLUMN ManagerID ;  
    GO  
    
  2. La colonna EmployeeID è anche ridondante.The EmployeeID column is also redundant. La colonna OrgNode identifica in modo univoco ogni dipendente.The OrgNode column uniquely identifies each employee. Se le altre applicazioni non richiedono la colonna EmployeeID , eliminare l'indice e successivamente la colonna usando il codice seguente:If other applications do not need the EmployeeID column, consider dropping the index and then the column by using the following code:

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

Per sostituire la tabella originale con la tabella nuovaTo replace the original table with the new table

  1. Se la tabella originale contiene vincoli o indici aggiuntivi, aggiungerli alla tabella NewOrg .If your original table contained any additional indexes or constraints, add them to the NewOrg table.

  2. Sostituire la vecchia colonna EmployeeDemo con la nuova tabella.Replace the old EmployeeDemo table with the new table. Eseguire il codice seguente per rilasciare la vecchia tabella e successivamente rinominare la tabella nuova con il nome vecchio:Run the following code to drop the old table, and then rename the new table with the old name:

    DROP TABLE EmployeeDemo ;  
    GO  
    sp_rename 'NewOrg', EmployeeDemo ;  
    GO  
    
  3. Eseguire il codice seguente per esaminare la tabella finale:Run the following code to examine the final table:

    SELECT * FROM EmployeeDemo ;  
    

Attività successiva della lezioneNext Task in Lesson

Riepilogo: Conversione di una tabella in una struttura gerarchicaSummary: Converting a Table to a Hierarchical Structure