2010-04-07 14 views
5

Siamo in procinto di passare dal generatore di guida casuale C# Guid.NewGuid() all'algoritmo di guida sequenziale suggerito in this post. Mentre questo sembra funzionare bene per MS SQL Server, non sono sicuro delle implicazioni per i database Oracle, in cui archiviamo i guids in un campo raw (16). Qualcuno ha qualche idea se questo algoritmo sarebbe buono per la creazione di guid sequenziali per Oracle e per MS SQL Server, o se dovrebbe essere utilizzata una variante diversa.GUID sequenziali (comb) per Oracle

Grazie!

risposta

2

L'utilizzo di raw (16) sembra essere un tipo di dati ragionevole per i GUID. La dimensione massima per il tipo di dati non elaborato è 2000 byte ed è supportata in Oracle 9i, 10g e 11.

C'è anche una funzione sql per generare GUID, si chiama SYS_GUID. vedere la documentazione qui->http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/functions153.htm

Potreste essere interessati a questo articolo ->http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

+0

Grazie per la risposta. Tuttavia, quello che cerco non è se raw sia un buon tipo di dati per i GUID in Oracle, ma piuttosto se l'algoritmo in questione causerà un'inutile frammentazione dell'indice in Oracle, anche se sembra essere una buona scelta per MS SQL Server. Inoltre, ho bisogno di generare i miei guids sul client, quindi la funzione SYS_GUID sarà di scarso aiuto. – Eyvind

+0

Che cos'è esattamente la frammentazione dell'indice inutile? Ovviamente i GUID saranno distribuiti (frammentati) attraverso l'intera stanza dei dati possibili. Ecco a cosa serve GUID. La frammentazione dei dati è una proprietà intrinseca dell'algoritmo GUID, che il database deve gestire, indipendentemente dal fatto che sia sql-server o oracle. L'implementazione dell'indice può gestirlo, vedi -> http://en.wikipedia.org/wiki/B-tree –

+0

L'idea è di usare un algoritmo che genera * sequenziali * guids, invece della versione standardizzata randomizzata. – Eyvind

1

Quando un blocco indice è 'troppo pieno' per un ingresso di più, è diviso.

Oracle ha due percorsi, uno ottimizzato per i valori di stile "sequenziale" e uno per i valori di tipo "casuale". Se la nuova voce si trova nella parte più a destra dell'indice, si ottiene una suddivisione 90-10. Se è da qualche parte nel mezzo, ottieni un 50-50. Se si desidera raggruppare i valori "nuovi" nell'indice, è utile un valore sequenziale. Se vuoi che siano sparpagliati (ad es. Per evitare conflitti su blocchi "caldi"), allora è utile un valore casuale.

Se la tecnica è "buona" per Oracle dipende dal problema che si sta tentando di risolvere.