2008-09-30 12 views
40

Vengo del mundo del servidor SQL donde tenía uniqueidentifier. ¿Hay un equivalente en el oráculo? Esta columna se consultará con frecuencia para que el rendimiento sea la clave.¿Cómo debo almacenar un GUID en Oracle?

Estoy generando el GUID en .Net y lo pasaré a Oracle. Por un par de razones, Oracle no puede generarlo, así que no puedo usar la secuencia.

Respuesta

39
CREATE table test (testguid RAW(16) default SYS_GUID()) 

This blog estudiaron el rendimiento relativo.

+0

El blog solo compara el trabajo con un guid que se genera desde el db como apposed para trabajar con sequence.nextval, pero me pregunto cómo es el rendimiento cuando se trabaja con guids generados desde el código .net ??? – gillyb

+0

Agregó esa aclaración en el segundo párrafo después de que respondí. Es probable que haya algún golpe de rendimiento en el inserto debido al tamaño de los índices y al hecho de que el índice se dividirá debido al aspecto aleatorio del guid de .Net. Si se usa la función Oracle nativa, se organizan secuencialmente para evitar que sea similar a la función en SQL Server. – Turnkey

+0

+1 para una respuesta concisa con la fuente, pero ¿cuál es el propósito de 'default SYS_GUID()'? Revisé el artículo, y no está claro para qué es esa parte. – zarose

0

No hay identificador único en Oracle.

Puede implementar uno usted mismo mediante RAW (tipo de dolor) o CHAR. Rendimiento en consultas que JOIN en un campo CHAR sufrirá (tal vez tanto como 40%) en comparación con el uso de un entero.

Si está haciendo bases de datos distribuidas/replicadas, el golpe de rendimiento lo vale. De lo contrario, solo usa un número entero.

0

La práctica general con Oracle es crear una clave artificial. Esta es una columna definida como un número. Se rellena a través de una secuencia. Está indexado/restringido a través de una definición de clave primaria.

3

Si entiendo la pregunta correctamente, desea generar una identificación única cuando inserta una fila en la base de datos.
Puede usar una secuencia para hacer esto. link here
Una vez que haya creado su secuencia se puede utilizar de esta manera:

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data'); 
2

GUID no son tal como se utiliza en Oracle como en MSSQL, que tienden a tener un campo de número (no nula & clave primaria), una secuencia, y un disparador en la inserción para poblarlo (para cada tabla).

6

Como han indicado otros, hay un golpe de rendimiento que utiliza GUID en comparación con las secuencias numéricas. Dicho esto, hay una función llamada "SYS_GUID()", disponible desde Oracle 8i que proporciona el equivalente en bruto:

SQL> SELECT SYS_GUID() FROM DUAL; 

SYS_GUID() 
-------------------------------- 
248AACE7F7DE424E8B9E1F31A9F101D5 

Una función podría ser creado para devolver un GUID con formato:

CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ; 
BEGIN 
    SELECT SYS_GUID() INTO guid FROM DUAL ; 

    guid := 
     '{' || SUBSTR(guid, 1, 8) || 
     '-' || SUBSTR(guid, 9, 4) || 
     '-' || SUBSTR(guid, 13, 4) || 
     '-' || SUBSTR(guid, 17, 4) || 
     '-' || SUBSTR(guid, 21) || '}' ; 

    RETURN guid ; 
END GET_FORMATTED_GUID ; 
/

Así devolver un intercambiables cadena:

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ; 

GET_FORMATTED_GUID() 
-------------------------------------- 
{15417950-9197-4ADD-BD49-BA043F262180} 

Una nota de precaución debe ser hecho que algunas plataformas Oracle devuelven valores similares, pero aún únicas de GUID as noted por Steven Feuerstein.

2

RAW (16) es aparentemente el equivalente preferido para el tipo único identificador MS SQL.

Cuestiones relacionadas