2008-09-30 2 views
40

Я прихожу из мира SQL-сервера, где у нас есть uniqueidentifier. Есть ли эквивалент в оракуле? Эта колонка будет часто запрашиваться, так что ключом является производительность.Как хранить GUID в Oracle?

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

ответ

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

This blog изучил относительную производительность.

+0

В блоге сравнивается только работа с направляющим, который генерируется из db, как показано на работе с sequence.nextval, но мне интересно, как производительность при работе с подсказками, созданными из .net-кода ??? – gillyb 2011-02-21 15:02:51

0

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

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

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

0

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

3

Если я правильно понял вопрос, вы хотите сгенерировать уникальный идентификатор, когда вы вставляете строку в db.
Чтобы сделать это, вы можете использовать последовательность . link here
После того, как вы создали свою последовательность вы можете использовать его как это:

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

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

6

Как указывали другие, с использованием идентификаторов 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 вернуть аналогичные, но до сих пор уникальные значения GUIDs as noted автор: Steven Feuerstein.

2

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

Смежные вопросы