2009-02-24 17 views
9

Ho una tabella con un numero elevato di righe (10 K +) e la chiave primaria è GUID. La chiave primaria è in cluster. La prestazione della query è piuttosto bassa su questa tabella. Si prega di fornire suggerimenti per renderlo efficiente.Miglioramento delle prestazioni dell'indice cluster Chiave primaria GUID

+1

Possibile duplicato di [Quali sono le migliori pratiche per l'utilizzo di un GUID come chiave primaria, in particolare per quanto riguarda le prestazioni?] (http://stackoverflow.com/questions/11938044/what-are-the-best-practices-for-using-a-guid-as-a-primary-key-specifically-rega) – AHiggins

+0

Non raggrupparlo! (se deve rimanere come GUID) – nashwan

risposta

4

è necessario utilizzare NEWSEQUENTIALID() invece vediamo qui Some Simple Code To Show The Difference Between Newid And Newsequentialid

+3

Ho letto molto su newsequentialid() ma sembra essere una funzione SQL, Qualcuno può dirmi cosa fare se Guid viene generato da Code (C#). –

+0

-1 Cosa c'entra questa risposta con il clustering fisico degli indici? La persona che ha posto la domanda ha già dichiarato di avere 10K + righe e probabilmente non vuole andare a cambiare tutte le chiavi. – nashwan

2

È possibile provare GUID sequenziali, rendendo l'indice più efficace. Info here.

38

Un indice cluster su GUID non è un buon progetto. La vera natura del GUID è che è casuale, mentre un indice cluster ordina fisicamente i record tramite la chiave. Le due cose sono completamente in disaccordo. Per ogni inserto SQL deve riordinare i record su disco! Rimuovi il clustering da questo indice!

Il tempo di utilizzare il clustering è quando si dispone di un ordine "naturale" per i dati: ora inserita, numero di conto, ecc. Per i campi di tempo, il clustering è quasi gratuito. Per il numero di conto, potrebbe essere gratuito o economico (quando i numeri di conto sono assegnati in sequenza).

Mentre ci possono essere modi tecnici per risolvere il problema GUID, l'idea migliore è capire quando utilizzare il clustering.

+3

+1 per il tono aspro. Non c'è molta area grigia in questa domanda. Non farlo – Droogans

-5

Si prega di evitare la creazione di cluster indice per le colonne di stringa lenghty. GUID avrà 36 caratteri. Ridurrà le prestazioni della query anche se è stato creato come indice cluster. per una migliore pratica, utilizza colonne di identità intera.

+2

Guid è di 16 byte - non 36 caratteri. I numeri interi –

+0

non sono un buon progetto per database di grandi dimensioni – Leonardo

+0

Kimberly Tripp discute molto bene questo problema per i tavoli di grandi dimensioni sul suo sito a questo link: [GUID come CHIAVI PRIMARI e/o chiave di clustering] (http://www.sqlskills.com /BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx). – Graeme

1

È necessario analizzare la query. Possiamo solo immaginare il motivo per cui le query si comportano male senza visualizzare il piano di esecuzione (che puoi tranquillamente ottenere da SQL Server o Oracle).

Considerando che un GUID è un valore di 128 bit (se memorizzato non elaborato), un GUID riduce la densità dei dati e dei blocchi di indice fino al 50% (nel caso dell'indice di chiave primaria) quindi assicurati GUID è appropriato.

Ma questo potrebbe non essere il problema, quindi rivedere il piano di query. Potrebbe essere diversi altri problemi.

7

Non c'è alcun problema con l'utilizzo di un GUID come chiave primaria. Assicurati solo che quando imposti effettivamente il GUID come chiave primaria, allora imposta l'indice che crea automaticamente per essere di tipo Non cluster. Un sacco di persone dimenticano (o non sanno) di farlo in SQL Server.

MAI utilizzare un indice cluster su un GUID. Ciò causerà un ordine fisico attorno al GUID sul disco, che è ovviamente inutile (come altri hanno già indicato)

+1

NON utilizzare MAI un indice cluster su un GUID? Questa è una dichiarazione audace. Sei sicuro che non ci siano contro esempi? – MarkPflug

+1

Si prega di nominarne uno se ne conoscete uno :-). Non vedo alcun motivo per cui si desideri ordinare fisicamente qualcosa attorno a un GUID. – nashwan

+1

Se le prestazioni di SELEZIONA è importante e verrà SELEZIONA su GUID ... –

Problemi correlati