Domande e risposte su SQLIndici non raggruppati e conservazione delle autorizzazioni

Saleem Hakani and Dan Carollo

Indici non raggruppati e relativo utilizzo

D Cosa sono gli indici non raggruppati e quali sono i pro e i contro del loro utilizzo?

R Un indice non raggruppato è simile al tipo di indice che si trova in genere alla fine di un libro. Nell'indice sono rappresentate tutte le informazioni contenute nel libro ordinate in base all'argomento ed esistono dei puntatori sotto forma di numeri di pagina che indirizzano il lettore ai punti in cui trovare le informazioni, anche in diverse aree del libro. Inoltre, i dati in un indice di libro non sono elencati nello stesso ordine in cui sono visualizzati nel testo del libro. Accade lo stesso con gli indici non raggruppati. Se per una tabella esiste un indice raggruppato, sarà possibile specificare l'ordine delle voci. In caso contrario non esiste altro modo per essere sicuri dell'ordine applicato.

Gli indici non raggruppati presentano inoltre due limiti: nell'indice possono essere contenute solo 16 colonne e la dimensione massima della chiave di indice non può superare i 900 byte. Che cosa significa? Ecco cosa accade quando si devono indicizzare le colonne seguenti nella tabella Movie del database MovieList di esempio: MovieTitle NVarchar(50), DirectorName NVarchar(50), ShortStory NVarchar(400).

Si supponga di utilizzare l'istruzione seguente per creare la tabella:

Use MovieList;
CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName, ShortStory); 

Verrà generato il seguente messaggio di errore: "Avviso: la lunghezza massima della chiave è di 900 byte. La lunghezza massima dell'indice "Movie_IDX" è di 1000 byte. In presenza di alcune combinazioni di valori di grandi dimensioni, l'operazione di inserimento/aggiornamento ha esito negativo". Il messaggio viene visualizzato perché il tipo di dati di "nvarchar" utilizza 2 byte per ciascun carattere; un indice con le tre colonne precedenti supererebbe il limite di dimensione di 900 byte.

Con la versione di SQL Server® 2005, ora è possibile risolvere il problema aggiungendo le colonne alla clausola INCLUDE. Si tratta di una funzionalità molto utile se si desidera risolvere entrambi i limiti di dimensione e numero di colonne. È quindi possibile utilizzare l'istruzione seguente:

CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName) INCLUDE (ShortStory);

È importante notare che, quando si utilizza la clausola INCLUDE durante la creazione dell'indice, il motore di database non considera le colonne non chiave per calcolare il numero di colonne chiave dell'indice o le dimensioni della chiave dell'indice.

Per trovare altre informazioni utili sugli indici non raggruppati, vedere l'articolo "Indici non raggruppati" all'indirizzo msdn2.microsoft.com/aa174537 e "Utilizzo degli indici non raggruppati" all'indirizzo msdn2.microsoft.com/aa933130. Per suggerimenti sull'ottimizzazione degli indici, vedere sql-server-performance.com/optimizing_ indexes.asp.

Conservazione dei dati delle autorizzazioni

D Come è possibile evitare di perdere le autorizzazioni quando viene reinizializzata una sottoscrizione? Il problema si presenta spesso quando si reinizializza uno snapshot, perché vengono perse tutte le autorizzazioni concesse.

R Per impostazione predefinita, quando si reinizializza una sottoscrizione, tutti gli oggetti presenti nel database vengono rimossi e quindi creati di nuovo. Esistono tuttavia due modi per gestire questo scenario.

È innanzitutto possibile riapplicare tutte le autorizzazioni dopo la reinizializzazione. Quando si configurano manualmente le autorizzazioni, è opportuno trasferire tutte le autorizzazioni a livello di oggetti o di istruzioni e archiviarle separatamente, in modo da poterle utilizzare subito dopo aver reinizializzato l'abbonamento.

In secondo luogo è possibile configurare la sottoscrizione in modo che non vengano rimossi oggetti quando si esegue la reinizializzazione. A tal fine è possibile utilizzare la stored procedure di sistema SP_CHANGEARTICLE per configurare il valore PRE_CREATION_CMD per il parametro @PROPERTY e il valore NONE, DELETE o TRUNCATE per il parametro @Value.

Inoltre, nella finestra di dialogo di Proprietà articolo nella sezione dell'oggetto di destinazione, selezionare i valori "Non modificare l'oggetto esistente, elimina i dati. Se all'articolo è associato un filtro di riga, elimina solo i dati che soddisfano i criteri del filtro. Tronca tutti i dati nell'oggetto esistente". Utilizzare questa impostazione nell'ambiente di test e, se si necessita di ulteriore aiuto, consultare le informazioni più aggiornate nella versione più recente della documentazione in linea di SQL Server.

Saleem Hakani è un Senior Database Engineer, Senior Problem Engineer e Worldwide Microsoft SQL Server Community Lead con 14 anni di esperienza nei sistemi di database. Gestisce il sito Web esterno della SQL Server Community sqlcommunity.com ed è possibile contattarlo all'indirizzo Saleem@sqlcommunity.com.

Dan Carollo è un Operations Engineer e amministratore di database SQL Server che lavora nel Windows Anti-Malware Research and Response in Microsoft. Ha conseguito la certificazione MCT in SQL Server.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.