Как мне хранить GUID в Oracle? - PullRequest
       62

Как мне хранить GUID в Oracle?

44 голосов
/ 30 сентября 2008

Я из мира SQL-серверов, где у нас был уникальный идентификатор. Есть ли эквивалент в оракуле? Этот столбец будет часто запрашиваться, поэтому ключевым фактором является производительность.

Я генерирую GUID в .Net и буду передавать его в Oracle. По нескольким причинам он не может быть сгенерирован оракулом, поэтому я не могу использовать последовательность.

Ответы [ 7 ]

47 голосов
/ 30 сентября 2008
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

В этом блоге изучены относительные показатели.

6 голосов
/ 08 октября 2009

Как уже говорили другие, при использовании GUID наблюдается снижение производительности по сравнению с числовыми последовательностями. Тем не менее, существует функция с именем " SYS_GUID () ", доступная начиная с Oracle 8i, которая предоставляет необработанный эквивалент:

SQL> SELECT SYS_GUID() FROM DUAL;

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

Можно создать функцию для возврата отформатированного GUID:

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 ;
/

Таким образом, возвращая сменную строку:

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;

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

Следует предостеречь, что некоторые платформы Oracle возвращают похожие, но все же уникальные значения идентификаторов GUID , как отметил Стивен Фейерштейн.

4 голосов
/ 30 сентября 2008

Если я правильно понимаю вопрос, вы хотите создать уникальный идентификатор при вставке строки в БД.
Вы можете использовать sequence для этого. ссылка здесь
После того, как вы создали свою последовательность, вы можете использовать ее следующим образом:

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
2 голосов
/ 28 февраля 2012

RAW (16), очевидно, является предпочтительным эквивалентом для типа MS SQL с уникальным идентификатором.

1 голос
/ 06 октября 2008

GUID не так используются в Oracle, как в MSSQL, у нас, как правило, есть поле NUMBER (не нулевой и первичный ключ), последовательность и триггер при вставке для его заполнения (для каждой таблицы).

0 голосов
/ 30 сентября 2008

Общая практика использования Oracle - создание искусственного ключа. Это столбец, определенный как число. Он заполняется через последовательность. Он индексируется / ограничивается определением первичного ключа.

0 голосов
/ 30 сентября 2008

В Oracle нет уникального идентификатора.

Вы можете реализовать его самостоятельно, используя RAW (боль) или CHAR. Производительность по запросам, которые JOIN для поля CHAR пострадают (может достигать 40%) по сравнению с использованием целого числа.

Если вы работаете с распределенными / реплицированными базами данных, снижение производительности того стоит. В противном случае просто используйте целое число.

...