Importazione di dati in parallelo tramite il blocco a livello di tabella

MicrosoftSQL Server consente a più client di eseguire un'importazione bulk dei dati in parallelo in una singola tabella non indicizzata. Ciò consente di migliorare le prestazioni delle operazioni di importazione bulk. L'importazione parallela dei dati è supportata per tutti e tre i comandi di importazione bulk, ovvero bcp, BULK INSERT e INSERT ... SELECT * FROM OPENROWSET(BULK...).

[!NOTA]

Il caricamento parallelo di dati in un'unica tabella è supportato solo dalle applicazioni che utilizzano le API ODBC o SQL OLE DB. Qualsiasi applicazione, inclusa l'utilità bcp, che sia basata sulla libreria client DB-Library disponibile con MicrosoftSQL Server versione 6.5 o precedenti non è in grado di prendere parte ai carichi di dati paralleli in un'istanza di SQL Server.

Se non si specifica l'opzione/hint TABLOCK, più flussi di importazione bulk simultanei acquisiscono i blocchi con una granularità inferiore al livello della tabella. A seconda della distribuzione dei dati, i flussi di caricamento bulk simultanei potrebbero bloccarsi reciprocamente. Per tale motivo, l'importazione bulk di dati in parallelo in una tabella non indicizzata viene in genere eseguita con TABLOCK.

Quando si esegue l'importazione bulk dei dati in parallelo in un'istanza di SQL Server utilizzando TABLOCK, si consideri quanto segue:

  • Lo scenario più semplice per l'importazione di dati in parallelo è il caricamento dei dati in una tabella non indicizzata, ovvero un heap.

  • Se la tabella è priva di indici, specificare l'opzione TABLOCK per l'operazione di importazione bulk. Per ulteriori informazioni, vedere Controllo della modalità di blocco per l'importazione bulk.

    [!NOTA]

    Se la tabella dispone di indici, non è possibile eseguire un'operazione di caricamento parallelo utilizzando l'opzione TABLOCK. Inoltre, i thread concorrenti si bloccano a vicenda se non si specifica TABLOCK. Prima di eseguire un'operazione di importazione bulk, si consideri l'opportunità di rimuovere gli indici dalla tabella. Per informazioni su come valutare l'opportunità di mantenere o rimuovere gli indici, vedere Linee guida per l'ottimizzazione dell'importazione bulk.

  • Dividere i dati da importare tra i client in un numero di file di dati uguale a quello di client presenti. Includere un file in ogni client.

    Procedura consigliata   Per utilizzare il processore in modo ottimale, distribuire i dati uniformemente tra i client. Se si desidera importare i file di dati in parallelo da più client in un'istanza di SQL Server, verificare che tali file abbiano dimensioni simili. In caso contrario, il thread di un client con carico ridotto potrebbe terminare in anticipo e, pertanto, utilizzare la CPU del client in modo non efficiente.

  • Per ottenere prestazioni ottimali, le dimensioni del batch specificate per ogni client devono essere identiche alle dimensioni del file di dati del client. Per ulteriori informazioni, vedere Gestione dei batch per l'importazione bulk.

Al termine dell'importazione bulk dei dati nella tabella, è possibile creare gli indici necessari eseguendo le operazioni seguenti:

  1. Creare ogni indice cluster, in sequenza, da un singolo client. Per ulteriori informazioni, vedere Creazione di indici cluster.

  2. Creare gli indici non cluster. Gli indici non cluster possono essere creati simultaneamente da client diversi. Per ulteriori informazioni, vedere Creazione di indici non cluster.

Se non si specifica TABLOCK, è possibile eseguire l'importazione bulk di dati in parallelo indipendentemente dal numero di indici presenti nella destinazione. In questo caso, però, l'ottimizzazione delle operazioni bulk non è possibile e possono verificarsi problemi durante l'acquisizione di blocchi su righe o pagine singole.