2009-12-16 17 views
9

Mi piacerebbe creare un indice su una vista che ho ma ho bisogno di assicurarmi che i dati possano ancora essere letti mentre l'indice viene creato. Stavo leggendo un article che ha suggerito che quando si crea un indice non cluster che i dati sono ancora leggibili se si specifica l'ONLINE = ON L'opzione (esempio qui sotto):La creazione di un indice non cluster su una tabella di SQL Server 2005 impedisce la selezione?

CREATE UNIQUE CLUSTERED INDEX CLUST_IDX_SQLTIPS 
ON SQLTips (tip) with (ONLINE=ON) 

Sto capendo questo correttamente? C'è qualche potenziale problema di cui dovrei essere a conoscenza prima di creare indici su una vista che deve essere leggibile mentre creo il mio indice?

risposta

14

La creazione e la ricostruzione dell'indice online sono disponibili solo su Enterprise Edition. Vedi How Online Index Operations Work e Guidelines for Performing Online Index Operations.

ci sono alcune limitazioni, quelli più notevole è:

  • indice cluster deve essere creato/ricostruita in linea se contengono tutti i campi BLOB (immagine, ntext, text, varchar (max), nvarchar (max) , varbinary (max) e xml).
  • indice clustering iniziale su una vista deve essere creato offline.

È necessario assicurarsi il database dispone di spazio sufficiente per eseguire l'operazione di indice in linea, in quanto richiede circa 1,5 volte la dimensione della tabella oltre alle dimensioni attuali. Durante la creazione dell'indice online, la tabella esiste due volte nel database, quindi lo spazio aggiuntivo necessario.

Poiché il tuo caso rientra nella categoria esclusa (indice cluster iniziale su una vista), non è necessario preoccuparsi degli indici online. È necessario utilizzare un'operazione di indicizzazione offline.

BTW è inoltre necessario tenere presente che le visualizzazioni indicizzate vengono considerate dall'ottimizzatore solo in Enterprise Edition. Nelle edizioni inferiori è necessario specificare la clausola NOEXPAND nella vista per sfruttare un possibile indice sulla vista.

+0

Grazie non me ne sono reso conto. Ho in programma di creare due indici su questa vista, il cluster iniziale che hai menzionato e un non cluster dopo quello. Sai comunque di mantenere i dati a mio avviso leggibili mentre creo il cluster iniziale? BTW Sto eseguendo l'edizione aziendale. –

+0

La vista indice cluster bloccherà le righe nella tabella, bloccando in tal modo le letture delle righe bloccate (sotto il livello di serializzazione predefinito). Quanto è grande il tavolo? Stiamo parlando di pochi secondi o di alcune ore di creazione dell'indice? Si può prendere in considerazione l'abilitazione di un'istantanea di lettura commessa, questo consentirà agli SELECT di andare avanti inalterati. Ma questo ha un impatto globale sul sistema, specialmente su tempdb, quindi dovresti testarlo in anticipo. –

+0

La tabella ha oltre 9 milioni di record. Sto pensando che gli indici impiegherebbero circa 15 minuti per creare. Se le persone non riescono a leggere per 15 minuti, avrei un problema. Potresti essere più specifico sull'impatto che l'attivazione di read commited avrebbe sul sistema? Come consiglieresti di testare prima mano? –

2

Ci sono ulteriori informazioni sugli articoli msdn su CREATE INDEX e online index operations che contiene molte informazioni a riguardo.

Non ci dovrebbero essere problemi con esso, se stai facendo solo SELECT e UPDATE. Non è così sicuro sui backup, forse è meglio provarlo su un sistema di test e vedere?

Problemi correlati